GeoSpark MCP
GeoSpark is a verifiable spatial reasoning MCP server that provides tools for computing geodesic distances, topology, isochrones, geocoding, elevation, weather, and site selection. It returns structured results with provenance, sources, and licenses, supporting both hosted and local deployment for AI agents.
Endpoint and access
No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.
https://geospark.terrascout.app/mcpWhat you can do with it
- Compute geodesic distances between coordinates or place names
- Generate isochrones and travel time matrices for site selection
- Geocode addresses and retrieve elevation or weather data
- Check spatial relationships and perform geometric operations
Source and maintenance
- Maintenance checked
Protocol and capabilities
- Server
- geospark 0.10.0
- MCP protocol
- 2025-06-18
- Tools
- 21 advertised
- Resources
- 0 advertised
- Resource templates
- 0 advertised
- Prompts
- 0 advertised
{
"tools": {
"listChanged": false
},
"prompts": {
"listChanged": false
},
"resources": {
"subscribe": false,
"listChanged": false
}
}Server-provided instructions
Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.
Tools
21 advertised
calculate_distance — Geodesic 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.
{
"type": "object",
"title": "calculate_distanceArguments",
"properties": {
"place_a": {
"anyOf": [
{
"type": "string",
"maxLength": 500
},
{
"type": "null"
}
],
"title": "Place A",
"default": null,
"description": "A place NAME, e.g. 'Adelaide Oval'; geocoded on the server (preferred)"
},
"place_b": {
"anyOf": [
{
"type": "string",
"maxLength": 500
},
{
"type": "null"
}
],
"title": "Place B",
"default": null,
"description": "A place NAME, e.g. 'Adelaide Oval'; geocoded on the server (preferred)"
},
"point_a": {
"anyOf": [
{
"type": "object",
"additionalProperties": true
},
{
"type": "null"
}
],
"title": "Point A",
"default": null,
"description": "A GeoJSON geometry, e.g. {\"type\": \"Point\", \"coordinates\": [lon, lat]}; only for coordinates the user gave or a tool returned"
},
"point_b": {
"anyOf": [
{
"type": "object",
"additionalProperties": true
},
{
"type": "null"
}
],
"title": "Point B",
"default": null,
"description": "A GeoJSON geometry, e.g. {\"type\": \"Point\", \"coordinates\": [lon, lat]}; only for coordinates the user gave or a tool returned"
}
}
}{
"type": "object",
"title": "DistanceResult",
"required": [
"distance_m",
"distance_km"
],
"properties": {
"units": {
"type": "object",
"title": "Units",
"description": "Unit of each numeric field",
"additionalProperties": {
"type": "string"
}
},
"places": {
"type": "array",
"items": {
"type": "object",
"additionalProperties": true
},
"title": "Places",
"description": "Named places as geocoded on the server: query, display_name, coordinates [lon, lat]"
},
"status": {
"enum": [
"ok",
"partial",
"cannot_answer"
],
"type": "string",
"title": "Status",
"default": "ok"
},
"warnings": {
"type": "array",
"items": {
"type": "string"
},
"title": "Warnings",
"description": "Caveats to tell the user"
},
"distance_m": {
"type": "number",
"title": "Distance M",
"description": "Geodesic distance in metres (WGS84 ellipsoid)"
},
"provenance": {
"type": "array",
"items": {
"type": "object",
"additionalProperties": true
},
"title": "Provenance",
"description": "Source, licence, attribution, retrieval time and method"
},
"distance_km": {
"type": "number",
"title": "Distance Km"
}
}
}{
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}check_spatial_relationship — Topological 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.
{
"type": "object",
"title": "check_spatial_relationshipArguments",
"required": [
"geometry_a",
"geometry_b",
"relationship"
],
"properties": {
"geometry_a": {
"type": "object",
"title": "Geometry A",
"description": "A GeoJSON geometry, e.g. {\"type\": \"Point\", \"coordinates\": [lon, lat]}",
"additionalProperties": true
},
"geometry_b": {
"type": "object",
"title": "Geometry B",
"description": "A GeoJSON geometry, e.g. {\"type\": \"Point\", \"coordinates\": [lon, lat]}",
"additionalProperties": true
},
"relationship": {
"enum": [
"contains",
"intersects",
"within",
"touches",
"crosses",
"overlaps",
"disjoint"
],
"type": "string",
"title": "Relationship"
}
}
}{
"type": "object",
"title": "RelationshipResult",
"required": [
"relationship",
"holds"
],
"properties": {
"holds": {
"type": "boolean",
"title": "Holds",
"description": "Whether geometry_a <relationship> geometry_b is true"
},
"units": {
"type": "object",
"title": "Units",
"description": "Unit of each numeric field",
"additionalProperties": {
"type": "string"
}
},
"status": {
"enum": [
"ok",
"partial",
"cannot_answer"
],
"type": "string",
"title": "Status",
"default": "ok"
},
"warnings": {
"type": "array",
"items": {
"type": "string"
},
"title": "Warnings",
"description": "Caveats to tell the user"
},
"provenance": {
"type": "array",
"items": {
"type": "object",
"additionalProperties": true
},
"title": "Provenance",
"description": "Source, licence, attribution, retrieval time and method"
},
"relationship": {
"type": "string",
"title": "Relationship"
}
}
}{
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}spatial_operation — Geometry 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.
{
"type": "object",
"title": "spatial_operationArguments",
"required": [
"operation",
"geometry"
],
"properties": {
"geometry": {
"type": "object",
"title": "Geometry",
"description": "A GeoJSON geometry, e.g. {\"type\": \"Point\", \"coordinates\": [lon, lat]}",
"additionalProperties": true
},
"radius_m": {
"anyOf": [
{
"type": "number",
"maximum": 100000,
"minimum": 0
},
{
"type": "null"
}
],
"title": "Radius M",
"default": null,
"description": "Buffer radius in metres"
},
"operation": {
"enum": [
"buffer",
"area",
"length",
"centroid",
"convex_hull"
],
"type": "string",
"title": "Operation"
}
}
}{
"type": "object",
"title": "FeatureCollection",
"required": [
"features"
],
"properties": {
"bbox": {
"anyOf": [
{
"type": "array",
"items": {
"type": "number"
}
},
{
"type": "null"
}
],
"title": "Bbox",
"default": null
},
"type": {
"type": "string",
"const": "FeatureCollection",
"title": "Type",
"default": "FeatureCollection"
},
"features": {
"type": "array",
"items": {
"type": "object",
"additionalProperties": true
},
"title": "Features"
},
"geospark": {
"type": "object",
"title": "Geospark",
"additionalProperties": true
}
},
"description": "An RFC 7946 GeoJSON FeatureCollection; `geospark` holds status, units, warnings, provenance."
}{
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}geocode — Geocode a place
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.
{
"type": "object",
"title": "geocodeArguments",
"required": [
"query"
],
"properties": {
"limit": {
"type": "integer",
"title": "Limit",
"default": 5,
"maximum": 10,
"minimum": 1
},
"query": {
"type": "string",
"title": "Query",
"maxLength": 500,
"minLength": 1,
"description": "Address or place name"
}
}
}{
"type": "object",
"title": "FeatureCollection",
"required": [
"features"
],
"properties": {
"bbox": {
"anyOf": [
{
"type": "array",
"items": {
"type": "number"
}
},
{
"type": "null"
}
],
"title": "Bbox",
"default": null
},
"type": {
"type": "string",
"const": "FeatureCollection",
"title": "Type",
"default": "FeatureCollection"
},
"features": {
"type": "array",
"items": {
"type": "object",
"additionalProperties": true
},
"title": "Features"
},
"geospark": {
"type": "object",
"title": "Geospark",
"additionalProperties": true
}
},
"description": "An RFC 7946 GeoJSON FeatureCollection; `geospark` holds status, units, warnings, provenance."
}{
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}reverse_geocode — Reverse geocode
Find the address or place at a coordinate (OpenStreetMap Nominatim).
{
"type": "object",
"title": "reverse_geocodeArguments",
"required": [
"latitude",
"longitude"
],
"properties": {
"latitude": {
"type": "number",
"title": "Latitude",
"maximum": 90,
"minimum": -90,
"description": "Latitude in degrees (WGS84)"
},
"longitude": {
"type": "number",
"title": "Longitude",
"maximum": 180,
"minimum": -180,
"description": "Longitude in degrees (WGS84)"
}
}
}{
"type": "object",
"title": "FeatureCollection",
"required": [
"features"
],
"properties": {
"bbox": {
"anyOf": [
{
"type": "array",
"items": {
"type": "number"
}
},
{
"type": "null"
}
],
"title": "Bbox",
"default": null
},
"type": {
"type": "string",
"const": "FeatureCollection",
"title": "Type",
"default": "FeatureCollection"
},
"features": {
"type": "array",
"items": {
"type": "object",
"additionalProperties": true
},
"title": "Features"
},
"geospark": {
"type": "object",
"title": "Geospark",
"additionalProperties": true
}
},
"description": "An RFC 7946 GeoJSON FeatureCollection; `geospark` holds status, units, warnings, provenance."
}{
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}get_elevation — Elevation
Ground elevation in metres (Copernicus GLO-30, Open Elevation fallback), with its vertical datum and accuracy.
{
"type": "object",
"title": "get_elevationArguments",
"required": [
"latitude",
"longitude"
],
"properties": {
"latitude": {
"type": "number",
"title": "Latitude",
"maximum": 90,
"minimum": -90,
"description": "Latitude in degrees (WGS84)"
},
"longitude": {
"type": "number",
"title": "Longitude",
"maximum": 180,
"minimum": -180,
"description": "Longitude in degrees (WGS84)"
}
}
}{
"type": "object",
"title": "ElevationResult",
"required": [
"latitude",
"longitude",
"elevation_m"
],
"properties": {
"units": {
"type": "object",
"title": "Units",
"description": "Unit of each numeric field",
"additionalProperties": {
"type": "string"
}
},
"status": {
"enum": [
"ok",
"partial",
"cannot_answer"
],
"type": "string",
"title": "Status",
"default": "ok"
},
"quality": {
"type": "object",
"title": "Quality",
"description": "e.g. vertical_accuracy_le90_m",
"additionalProperties": true
},
"latitude": {
"type": "number",
"title": "Latitude"
},
"warnings": {
"type": "array",
"items": {
"type": "string"
},
"title": "Warnings",
"description": "Caveats to tell the user"
},
"longitude": {
"type": "number",
"title": "Longitude"
},
"provenance": {
"type": "array",
"items": {
"type": "object",
"additionalProperties": true
},
"title": "Provenance",
"description": "Source, licence, attribution, retrieval time and method"
},
"attribution": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Attribution",
"default": null
},
"elevation_m": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"title": "Elevation M"
},
"vertical_datum": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Vertical Datum",
"default": null
}
}
}{
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}route — Driving route
Driving route between two points (OSRM over OpenStreetMap): line geometry, distance in metres and duration in seconds.
{
"type": "object",
"title": "routeArguments",
"required": [
"from_latitude",
"from_longitude",
"to_latitude",
"to_longitude"
],
"properties": {
"to_latitude": {
"type": "number",
"title": "To Latitude",
"maximum": 90,
"minimum": -90,
"description": "Latitude in degrees (WGS84)"
},
"to_longitude": {
"type": "number",
"title": "To Longitude",
"maximum": 180,
"minimum": -180,
"description": "Longitude in degrees (WGS84)"
},
"from_latitude": {
"type": "number",
"title": "From Latitude",
"maximum": 90,
"minimum": -90,
"description": "Latitude in degrees (WGS84)"
},
"from_longitude": {
"type": "number",
"title": "From Longitude",
"maximum": 180,
"minimum": -180,
"description": "Longitude in degrees (WGS84)"
}
}
}{
"type": "object",
"title": "FeatureCollection",
"required": [
"features"
],
"properties": {
"bbox": {
"anyOf": [
{
"type": "array",
"items": {
"type": "number"
}
},
{
"type": "null"
}
],
"title": "Bbox",
"default": null
},
"type": {
"type": "string",
"const": "FeatureCollection",
"title": "Type",
"default": "FeatureCollection"
},
"features": {
"type": "array",
"items": {
"type": "object",
"additionalProperties": true
},
"title": "Features"
},
"geospark": {
"type": "object",
"title": "Geospark",
"additionalProperties": true
}
},
"description": "An RFC 7946 GeoJSON FeatureCollection; `geospark` holds status, units, warnings, provenance."
}{
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}get_weather — Weather
Current weather and a daily forecast for a point (Open-Meteo, no key needed).
{
"type": "object",
"title": "get_weatherArguments",
"required": [
"latitude",
"longitude"
],
"properties": {
"latitude": {
"type": "number",
"title": "Latitude",
"maximum": 90,
"minimum": -90,
"description": "Latitude in degrees (WGS84)"
},
"longitude": {
"type": "number",
"title": "Longitude",
"maximum": 180,
"minimum": -180,
"description": "Longitude in degrees (WGS84)"
},
"forecast_days": {
"type": "integer",
"title": "Forecast Days",
"default": 3,
"maximum": 16,
"minimum": 1
}
}
}{
"type": "object",
"title": "DataResult",
"required": [
"channel",
"features"
],
"properties": {
"query": {
"type": "object",
"title": "Query",
"additionalProperties": true
},
"units": {
"type": "object",
"title": "Units",
"description": "Unit of each numeric field",
"additionalProperties": {
"type": "string"
}
},
"status": {
"enum": [
"ok",
"partial",
"cannot_answer"
],
"type": "string",
"title": "Status",
"default": "ok"
},
"channel": {
"type": "string",
"title": "Channel"
},
"features": {
"type": "array",
"items": {
"type": "object",
"additionalProperties": true
},
"title": "Features",
"description": "Records from the data source"
},
"warnings": {
"type": "array",
"items": {
"type": "string"
},
"title": "Warnings",
"description": "Caveats to tell the user"
},
"provenance": {
"type": "array",
"items": {
"type": "object",
"additionalProperties": true
},
"title": "Provenance",
"description": "Source, licence, attribution, retrieval time and method"
},
"total_results": {
"type": "integer",
"title": "Total Results",
"default": 0
}
}
}{
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}get_air_quality — 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.
{
"type": "object",
"title": "get_air_qualityArguments",
"required": [
"latitude",
"longitude"
],
"properties": {
"latitude": {
"type": "number",
"title": "Latitude",
"maximum": 90,
"minimum": -90,
"description": "Latitude in degrees (WGS84)"
},
"longitude": {
"type": "number",
"title": "Longitude",
"maximum": 180,
"minimum": -180,
"description": "Longitude in degrees (WGS84)"
}
}
}{
"type": "object",
"title": "DataResult",
"required": [
"channel",
"features"
],
"properties": {
"query": {
"type": "object",
"title": "Query",
"additionalProperties": true
},
"units": {
"type": "object",
"title": "Units",
"description": "Unit of each numeric field",
"additionalProperties": {
"type": "string"
}
},
"status": {
"enum": [
"ok",
"partial",
"cannot_answer"
],
"type": "string",
"title": "Status",
"default": "ok"
},
"channel": {
"type": "string",
"title": "Channel"
},
"features": {
"type": "array",
"items": {
"type": "object",
"additionalProperties": true
},
"title": "Features",
"description": "Records from the data source"
},
"warnings": {
"type": "array",
"items": {
"type": "string"
},
"title": "Warnings",
"description": "Caveats to tell the user"
},
"provenance": {
"type": "array",
"items": {
"type": "object",
"additionalProperties": true
},
"title": "Provenance",
"description": "Source, licence, attribution, retrieval time and method"
},
"total_results": {
"type": "integer",
"title": "Total Results",
"default": 0
}
}
}{
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}get_active_fires — Active fires
Satellite active-fire detections near a point (NASA FIRMS; the server needs a FIRMS_MAP_KEY).
{
"type": "object",
"title": "get_active_firesArguments",
"required": [
"latitude",
"longitude"
],
"properties": {
"days": {
"type": "integer",
"title": "Days",
"default": 1,
"maximum": 2,
"minimum": 1
},
"latitude": {
"type": "number",
"title": "Latitude",
"maximum": 90,
"minimum": -90,
"description": "Latitude in degrees (WGS84)"
},
"longitude": {
"type": "number",
"title": "Longitude",
"maximum": 180,
"minimum": -180,
"description": "Longitude in degrees (WGS84)"
}
}
}{
"type": "object",
"title": "DataResult",
"required": [
"channel",
"features"
],
"properties": {
"query": {
"type": "object",
"title": "Query",
"additionalProperties": true
},
"units": {
"type": "object",
"title": "Units",
"description": "Unit of each numeric field",
"additionalProperties": {
"type": "string"
}
},
"status": {
"enum": [
"ok",
"partial",
"cannot_answer"
],
"type": "string",
"title": "Status",
"default": "ok"
},
"channel": {
"type": "string",
"title": "Channel"
},
"features": {
"type": "array",
"items": {
"type": "object",
"additionalProperties": true
},
"title": "Features",
"description": "Records from the data source"
},
"warnings": {
"type": "array",
"items": {
"type": "string"
},
"title": "Warnings",
"description": "Caveats to tell the user"
},
"provenance": {
"type": "array",
"items": {
"type": "object",
"additionalProperties": true
},
"title": "Provenance",
"description": "Source, licence, attribution, retrieval time and method"
},
"total_results": {
"type": "integer",
"title": "Total Results",
"default": 0
}
}
}{
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}isochrone — Isochrone (reachable area)
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).
{
"type": "object",
"title": "isochroneArguments",
"required": [
"latitude",
"longitude"
],
"properties": {
"mode": {
"enum": [
"walk",
"bike",
"drive"
],
"type": "string",
"title": "Mode",
"default": "walk"
},
"minutes": {
"type": "array",
"items": {
"type": "integer"
},
"title": "Minutes",
"default": [
10
],
"maxItems": 4,
"minItems": 1,
"description": "Contour times, 1-60"
},
"latitude": {
"type": "number",
"title": "Latitude",
"maximum": 90,
"minimum": -90,
"description": "Latitude in degrees (WGS84)"
},
"longitude": {
"type": "number",
"title": "Longitude",
"maximum": 180,
"minimum": -180,
"description": "Longitude in degrees (WGS84)"
}
}
}{
"type": "object",
"title": "FeatureCollection",
"required": [
"features"
],
"properties": {
"bbox": {
"anyOf": [
{
"type": "array",
"items": {
"type": "number"
}
},
{
"type": "null"
}
],
"title": "Bbox",
"default": null
},
"type": {
"type": "string",
"const": "FeatureCollection",
"title": "Type",
"default": "FeatureCollection"
},
"features": {
"type": "array",
"items": {
"type": "object",
"additionalProperties": true
},
"title": "Features"
},
"geospark": {
"type": "object",
"title": "Geospark",
"additionalProperties": true
}
},
"description": "An RFC 7946 GeoJSON FeatureCollection; `geospark` holds status, units, warnings, provenance."
}{
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}travel_time_matrix — Travel-time matrix
Network travel time (minutes) and distance (metres) from each origin to each destination. Note: points here are [latitude, longitude] pairs.
{
"type": "object",
"title": "travel_time_matrixArguments",
"required": [
"origins",
"destinations"
],
"properties": {
"mode": {
"enum": [
"walk",
"bike",
"drive"
],
"type": "string",
"title": "Mode",
"default": "walk"
},
"origins": {
"type": "array",
"items": {
"type": "array",
"maxItems": 2,
"minItems": 2,
"prefixItems": [
{
"type": "number"
},
{
"type": "number"
}
]
},
"title": "Origins",
"maxItems": 5,
"minItems": 1,
"description": "[[lat, lon], ...]"
},
"destinations": {
"type": "array",
"items": {
"type": "array",
"maxItems": 2,
"minItems": 2,
"prefixItems": [
{
"type": "number"
},
{
"type": "number"
}
]
},
"title": "Destinations",
"maxItems": 5,
"minItems": 1,
"description": "[[lat, lon], ...]"
}
}
}{
"type": "object",
"title": "FeatureCollection",
"required": [
"features"
],
"properties": {
"bbox": {
"anyOf": [
{
"type": "array",
"items": {
"type": "number"
}
},
{
"type": "null"
}
],
"title": "Bbox",
"default": null
},
"type": {
"type": "string",
"const": "FeatureCollection",
"title": "Type",
"default": "FeatureCollection"
},
"features": {
"type": "array",
"items": {
"type": "object",
"additionalProperties": true
},
"title": "Features"
},
"geospark": {
"type": "object",
"title": "Geospark",
"additionalProperties": true
}
},
"description": "An RFC 7946 GeoJSON FeatureCollection; `geospark` holds status, units, warnings, provenance."
}{
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}overture_features — Overture Maps 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.
{
"type": "object",
"title": "overture_featuresArguments",
"required": [
"theme",
"latitude",
"longitude"
],
"properties": {
"limit": {
"anyOf": [
{
"type": "integer",
"maximum": 2000,
"minimum": 1
},
{
"type": "null"
}
],
"title": "Limit",
"default": null
},
"theme": {
"enum": [
"places",
"buildings",
"transportation",
"divisions"
],
"type": "string",
"title": "Theme"
},
"category": {
"anyOf": [
{
"type": "string",
"maxLength": 100
},
{
"type": "null"
}
],
"title": "Category",
"default": null,
"description": "Places only, e.g. 'cafe'"
},
"latitude": {
"type": "number",
"title": "Latitude",
"maximum": 90,
"minimum": -90,
"description": "Latitude in degrees (WGS84)"
},
"radius_m": {
"type": "number",
"title": "Radius M",
"default": 300,
"maximum": 2000,
"description": "Search radius in metres",
"exclusiveMinimum": 0
},
"longitude": {
"type": "number",
"title": "Longitude",
"maximum": 180,
"minimum": -180,
"description": "Longitude in degrees (WGS84)"
}
}
}{
"type": "object",
"title": "FeatureCollection",
"required": [
"features"
],
"properties": {
"bbox": {
"anyOf": [
{
"type": "array",
"items": {
"type": "number"
}
},
{
"type": "null"
}
],
"title": "Bbox",
"default": null
},
"type": {
"type": "string",
"const": "FeatureCollection",
"title": "Type",
"default": "FeatureCollection"
},
"features": {
"type": "array",
"items": {
"type": "object",
"additionalProperties": true
},
"title": "Features"
},
"geospark": {
"type": "object",
"title": "Geospark",
"additionalProperties": true
}
},
"description": "An RFC 7946 GeoJSON FeatureCollection; `geospark` holds status, units, warnings, provenance."
}{
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}transform_coordinates — Transform coordinates (official datums)
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.
{
"type": "object",
"title": "transform_coordinatesArguments",
"required": [
"source_crs",
"target_crs",
"coordinates"
],
"properties": {
"epoch": {
"anyOf": [
{
"type": "number",
"maximum": 2100,
"minimum": 1900
},
{
"type": "null"
}
],
"title": "Epoch",
"default": null,
"description": "Decimal year, for ITRF/ATRF frames"
},
"source_crs": {
"type": "string",
"title": "Source Crs",
"maxLength": 100,
"description": "CRS name or EPSG code, e.g. 'GDA94 / MGA zone 55' or EPSG:28355"
},
"target_crs": {
"type": "string",
"title": "Target Crs",
"maxLength": 100,
"description": "CRS name or EPSG code, e.g. 'GDA2020 / MGA zone 55' or EPSG:7855"
},
"coordinates": {
"type": "array",
"items": {
"type": "array",
"items": {
"type": "number"
}
},
"title": "Coordinates",
"maxItems": 1000,
"minItems": 1,
"description": "[x, y] or [x, y, z]: [lon, lat] or [easting, northing]"
}
}
}{
"type": "object",
"title": "TransformResult",
"required": [
"coordinates",
"source_crs",
"target_crs",
"method",
"accuracy_m"
],
"properties": {
"grids": {
"type": "array",
"items": {
"type": "string"
},
"title": "Grids",
"description": "Official grid files the operation used"
},
"units": {
"type": "object",
"title": "Units",
"description": "Unit of each numeric field",
"additionalProperties": {
"type": "string"
}
},
"method": {
"type": "string",
"title": "Method",
"description": "The EPSG operation used"
},
"status": {
"enum": [
"ok",
"partial",
"cannot_answer"
],
"type": "string",
"title": "Status",
"default": "ok"
},
"warnings": {
"type": "array",
"items": {
"type": "string"
},
"title": "Warnings",
"description": "Caveats to tell the user"
},
"accuracy_m": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"title": "Accuracy M",
"description": "The operation's stated accuracy; null for an exact conversion"
},
"provenance": {
"type": "array",
"items": {
"type": "object",
"additionalProperties": true
},
"title": "Provenance",
"description": "Source, licence, attribution, retrieval time and method"
},
"source_crs": {
"type": "string",
"title": "Source Crs"
},
"target_crs": {
"type": "string",
"title": "Target Crs"
},
"area_of_use": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Area Of Use",
"default": null
},
"coordinates": {
"type": "array",
"items": {
"type": "array",
"items": {
"type": "number"
}
},
"title": "Coordinates",
"description": "Transformed points, in the target CRS's x/y(/z) order"
}
}
}{
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}convert_height — Convert height (geoid models)
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.
{
"type": "object",
"title": "convert_heightArguments",
"required": [
"latitude",
"longitude",
"height_m",
"from_reference",
"to_reference"
],
"properties": {
"height_m": {
"type": "number",
"title": "Height M",
"maximum": 10000,
"minimum": -1000,
"description": "The height to convert, in metres"
},
"latitude": {
"type": "number",
"title": "Latitude",
"maximum": 90,
"minimum": -90,
"description": "Latitude in degrees (WGS84)"
},
"longitude": {
"type": "number",
"title": "Longitude",
"maximum": 180,
"minimum": -180,
"description": "Longitude in degrees (WGS84)"
},
"to_reference": {
"type": "string",
"title": "To Reference",
"description": "'ellipsoidal', AHD, ODN, NZVD2016, NAVD88 or EGM2008"
},
"from_reference": {
"type": "string",
"title": "From Reference",
"description": "'ellipsoidal', AHD, ODN, NZVD2016, NAVD88 or EGM2008"
}
}
}{
"type": "object",
"title": "HeightResult",
"required": [
"height_m",
"from_reference",
"to_reference",
"geoid_model",
"separation_m",
"method",
"accuracy_m"
],
"properties": {
"grids": {
"type": "array",
"items": {
"type": "string"
},
"title": "Grids"
},
"units": {
"type": "object",
"title": "Units",
"description": "Unit of each numeric field",
"additionalProperties": {
"type": "string"
}
},
"method": {
"type": "string",
"title": "Method"
},
"status": {
"enum": [
"ok",
"partial",
"cannot_answer"
],
"type": "string",
"title": "Status",
"default": "ok"
},
"height_m": {
"type": "number",
"title": "Height M"
},
"warnings": {
"type": "array",
"items": {
"type": "string"
},
"title": "Warnings",
"description": "Caveats to tell the user"
},
"accuracy_m": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"title": "Accuracy M"
},
"provenance": {
"type": "array",
"items": {
"type": "object",
"additionalProperties": true
},
"title": "Provenance",
"description": "Source, licence, attribution, retrieval time and method"
},
"geoid_model": {
"type": "string",
"title": "Geoid Model"
},
"separation_m": {
"type": "number",
"title": "Separation M",
"description": "Ellipsoidal height minus the datum height at this point"
},
"to_reference": {
"type": "string",
"title": "To Reference"
},
"from_reference": {
"type": "string",
"title": "From Reference"
}
}
}{
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}sun_position — Sun position and shadow
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).
{
"type": "object",
"title": "sun_positionArguments",
"required": [
"latitude",
"longitude",
"time"
],
"properties": {
"tz": {
"anyOf": [
{
"type": "string",
"maxLength": 60
},
{
"type": "null"
}
],
"title": "Tz",
"default": null,
"description": "IANA time zone for a local time, e.g. Australia/Melbourne"
},
"time": {
"type": "string",
"title": "Time",
"maxLength": 40,
"description": "ISO 8601, with a UTC offset (2026-12-21T12:00:00+11:00) or local with tz"
},
"latitude": {
"type": "number",
"title": "Latitude",
"maximum": 90,
"minimum": -90,
"description": "Latitude in degrees (WGS84)"
},
"longitude": {
"type": "number",
"title": "Longitude",
"maximum": 180,
"minimum": -180,
"description": "Longitude in degrees (WGS84)"
},
"object_height_m": {
"anyOf": [
{
"type": "number",
"maximum": 10000,
"exclusiveMinimum": 0
},
{
"type": "null"
}
],
"title": "Object Height M",
"default": null,
"description": "Height of a vertical object, for its shadow"
}
}
}{
"type": "object",
"title": "SunResult",
"required": [
"time",
"elevation_deg",
"azimuth_deg",
"declination_deg",
"equation_of_time_min",
"above_horizon",
"method"
],
"properties": {
"time": {
"type": "string",
"title": "Time"
},
"units": {
"type": "object",
"title": "Units",
"description": "Unit of each numeric field",
"additionalProperties": {
"type": "string"
}
},
"method": {
"type": "string",
"title": "Method"
},
"status": {
"enum": [
"ok",
"partial",
"cannot_answer"
],
"type": "string",
"title": "Status",
"default": "ok"
},
"warnings": {
"type": "array",
"items": {
"type": "string"
},
"title": "Warnings",
"description": "Caveats to tell the user"
},
"provenance": {
"type": "array",
"items": {
"type": "object",
"additionalProperties": true
},
"title": "Provenance",
"description": "Source, licence, attribution, retrieval time and method"
},
"azimuth_deg": {
"type": "number",
"title": "Azimuth Deg",
"description": "Clockwise from true north"
},
"above_horizon": {
"type": "boolean",
"title": "Above Horizon"
},
"elevation_deg": {
"type": "number",
"title": "Elevation Deg",
"description": "Apparent elevation above a flat horizon, refraction included"
},
"declination_deg": {
"type": "number",
"title": "Declination Deg"
},
"shadow_length_m": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"title": "Shadow Length M",
"default": null,
"description": "On level ground, for object_height_m"
},
"equation_of_time_min": {
"type": "number",
"title": "Equation Of Time Min"
},
"shadow_direction_deg": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"title": "Shadow Direction Deg",
"default": null,
"description": "Direction the shadow points, from true north"
}
}
}{
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}sun_times — Sunrise, sunset and hours of sun
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.
{
"type": "object",
"title": "sun_timesArguments",
"required": [
"latitude",
"longitude",
"date"
],
"properties": {
"tz": {
"anyOf": [
{
"type": "string",
"maxLength": 60
},
{
"type": "null"
}
],
"title": "Tz",
"default": null,
"description": "IANA time zone, e.g. Australia/Melbourne; default UTC"
},
"date": {
"type": "string",
"title": "Date",
"maxLength": 10,
"description": "Local date, YYYY-MM-DD"
},
"terrain": {
"type": "boolean",
"title": "Terrain",
"default": false,
"description": "Also count hours of direct sun above the terrain horizon (reads the DEM; ~10-60 s)"
},
"latitude": {
"type": "number",
"title": "Latitude",
"maximum": 90,
"minimum": -90,
"description": "Latitude in degrees (WGS84)"
},
"longitude": {
"type": "number",
"title": "Longitude",
"maximum": 180,
"minimum": -180,
"description": "Longitude in degrees (WGS84)"
}
}
}{
"type": "object",
"title": "SunTimesResult",
"required": [
"date",
"time_zone",
"sunrise",
"solar_noon",
"sunset",
"day_length_h",
"solar_noon_elevation_deg",
"method"
],
"properties": {
"date": {
"type": "string",
"title": "Date"
},
"units": {
"type": "object",
"title": "Units",
"description": "Unit of each numeric field",
"additionalProperties": {
"type": "string"
}
},
"method": {
"type": "string",
"title": "Method"
},
"status": {
"enum": [
"ok",
"partial",
"cannot_answer"
],
"type": "string",
"title": "Status",
"default": "ok"
},
"sunset": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Sunset"
},
"sunrise": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Sunrise"
},
"warnings": {
"type": "array",
"items": {
"type": "string"
},
"title": "Warnings",
"description": "Caveats to tell the user"
},
"time_zone": {
"type": "string",
"title": "Time Zone"
},
"provenance": {
"type": "array",
"items": {
"type": "object",
"additionalProperties": true
},
"title": "Provenance",
"description": "Source, licence, attribution, retrieval time and method"
},
"solar_noon": {
"type": "string",
"title": "Solar Noon"
},
"day_length_h": {
"type": "number",
"title": "Day Length H"
},
"terrain_hours": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"title": "Terrain Hours",
"default": null,
"description": "Hours of direct sun above the terrain horizon"
},
"last_direct_sun": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Last Direct Sun",
"default": null
},
"first_direct_sun": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "First Direct Sun",
"default": null
},
"solar_noon_elevation_deg": {
"type": "number",
"title": "Solar Noon Elevation Deg"
}
}
}{
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}terrain_horizon — 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.
{
"type": "object",
"title": "terrain_horizonArguments",
"required": [
"latitude",
"longitude"
],
"properties": {
"latitude": {
"type": "number",
"title": "Latitude",
"maximum": 90,
"minimum": -90,
"description": "Latitude in degrees (WGS84)"
},
"step_deg": {
"type": "number",
"title": "Step Deg",
"default": 5,
"maximum": 10,
"minimum": 0.5,
"description": "Azimuth spacing; must divide 360"
},
"longitude": {
"type": "number",
"title": "Longitude",
"maximum": 180,
"minimum": -180,
"description": "Longitude in degrees (WGS84)"
},
"max_distance_m": {
"type": "number",
"title": "Max Distance M",
"default": 20000,
"maximum": 50000,
"minimum": 500
},
"observer_height_m": {
"type": "number",
"title": "Observer Height M",
"default": 1.5,
"maximum": 500,
"minimum": 0,
"description": "Eye or sensor height above ground"
}
}
}{
"type": "object",
"title": "HorizonResult",
"required": [
"latitude",
"longitude",
"ground_elevation_m",
"observer_height_m",
"max_distance_m",
"azimuths_deg",
"horizon_elevation_deg",
"obstruction_distance_m",
"highest",
"method"
],
"properties": {
"units": {
"type": "object",
"title": "Units",
"description": "Unit of each numeric field",
"additionalProperties": {
"type": "string"
}
},
"method": {
"type": "string",
"title": "Method"
},
"status": {
"enum": [
"ok",
"partial",
"cannot_answer"
],
"type": "string",
"title": "Status",
"default": "ok"
},
"highest": {
"type": "object",
"title": "Highest",
"additionalProperties": {
"type": "number"
}
},
"latitude": {
"type": "number",
"title": "Latitude"
},
"warnings": {
"type": "array",
"items": {
"type": "string"
},
"title": "Warnings",
"description": "Caveats to tell the user"
},
"longitude": {
"type": "number",
"title": "Longitude"
},
"provenance": {
"type": "array",
"items": {
"type": "object",
"additionalProperties": true
},
"title": "Provenance",
"description": "Source, licence, attribution, retrieval time and method"
},
"azimuths_deg": {
"type": "array",
"items": {
"type": "number"
},
"title": "Azimuths Deg"
},
"max_distance_m": {
"type": "number",
"title": "Max Distance M"
},
"observer_height_m": {
"type": "number",
"title": "Observer Height M"
},
"ground_elevation_m": {
"type": "number",
"title": "Ground Elevation M"
},
"horizon_elevation_deg": {
"type": "array",
"items": {
"type": "number"
},
"title": "Horizon Elevation Deg",
"description": "Skyline elevation angle at each azimuth"
},
"obstruction_distance_m": {
"type": "array",
"items": {
"type": "number"
},
"title": "Obstruction Distance M"
}
}
}{
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}line_of_sight — 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).
{
"type": "object",
"title": "line_of_sightArguments",
"required": [
"lat_a",
"lon_a",
"lat_b",
"lon_b"
],
"properties": {
"lat_a": {
"type": "number",
"title": "Lat A",
"maximum": 90,
"minimum": -90,
"description": "Latitude in degrees (WGS84)"
},
"lat_b": {
"type": "number",
"title": "Lat B",
"maximum": 90,
"minimum": -90,
"description": "Latitude in degrees (WGS84)"
},
"lon_a": {
"type": "number",
"title": "Lon A",
"maximum": 180,
"minimum": -180,
"description": "Longitude in degrees (WGS84)"
},
"lon_b": {
"type": "number",
"title": "Lon B",
"maximum": 180,
"minimum": -180,
"description": "Longitude in degrees (WGS84)"
},
"height_a_m": {
"type": "number",
"title": "Height A M",
"default": 1.5,
"maximum": 1000,
"minimum": 0,
"description": "Height above ground at A (e.g. a mast)"
},
"height_b_m": {
"type": "number",
"title": "Height B M",
"default": 1.5,
"maximum": 1000,
"minimum": 0,
"description": "Height above ground at B"
},
"frequency_mhz": {
"anyOf": [
{
"type": "number",
"maximum": 300000,
"minimum": 1
},
{
"type": "null"
}
],
"title": "Frequency Mhz",
"default": null,
"description": "For a radio link: report first Fresnel zone clearance"
}
}
}{
"type": "object",
"title": "LineOfSightResult",
"required": [
"visible",
"distance_m",
"bearing_deg",
"min_clearance_m",
"min_clearance_at",
"method"
],
"properties": {
"units": {
"type": "object",
"title": "Units",
"description": "Unit of each numeric field",
"additionalProperties": {
"type": "string"
}
},
"method": {
"type": "string",
"title": "Method"
},
"status": {
"enum": [
"ok",
"partial",
"cannot_answer"
],
"type": "string",
"title": "Status",
"default": "ok"
},
"fresnel": {
"anyOf": [
{
"type": "object",
"additionalProperties": true
},
{
"type": "null"
}
],
"title": "Fresnel",
"default": null
},
"visible": {
"type": "boolean",
"title": "Visible"
},
"warnings": {
"type": "array",
"items": {
"type": "string"
},
"title": "Warnings",
"description": "Caveats to tell the user"
},
"distance_m": {
"type": "number",
"title": "Distance M"
},
"provenance": {
"type": "array",
"items": {
"type": "object",
"additionalProperties": true
},
"title": "Provenance",
"description": "Source, licence, attribution, retrieval time and method"
},
"bearing_deg": {
"type": "number",
"title": "Bearing Deg"
},
"min_clearance_m": {
"type": "number",
"title": "Min Clearance M",
"description": "Smallest gap between the sight line and the terrain; negative = blocked"
},
"min_clearance_at": {
"type": "object",
"title": "Min Clearance At",
"additionalProperties": {
"type": "number"
}
}
}
}{
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}location_report — 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.
{
"type": "object",
"title": "location_reportArguments",
"required": [
"location"
],
"properties": {
"location": {
"type": "string",
"title": "Location",
"maxLength": 500,
"minLength": 1,
"description": "Place to analyse"
},
"radius_m": {
"type": "number",
"title": "Radius M",
"default": 1000,
"maximum": 10000,
"exclusiveMinimum": 0
}
}
}{
"type": "object",
"title": "FeatureCollection",
"required": [
"features"
],
"properties": {
"bbox": {
"anyOf": [
{
"type": "array",
"items": {
"type": "number"
}
},
{
"type": "null"
}
],
"title": "Bbox",
"default": null
},
"type": {
"type": "string",
"const": "FeatureCollection",
"title": "Type",
"default": "FeatureCollection"
},
"features": {
"type": "array",
"items": {
"type": "object",
"additionalProperties": true
},
"title": "Features"
},
"geospark": {
"type": "object",
"title": "Geospark",
"additionalProperties": true
}
},
"description": "An RFC 7946 GeoJSON FeatureCollection; `geospark` holds status, units, warnings, provenance."
}{
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}select_site — Site selection
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.
{
"type": "object",
"title": "select_siteArguments",
"required": [
"within"
],
"properties": {
"near": {
"type": "array",
"items": {
"type": "string"
},
"title": "Near",
"default": [],
"maxItems": 10,
"description": "Amenity types to be close to"
},
"avoid": {
"type": "array",
"items": {
"type": "string"
},
"title": "Avoid",
"default": [],
"maxItems": 10,
"description": "Amenity types to stay away from"
},
"within": {
"type": "string",
"title": "Within",
"maxLength": 500,
"minLength": 1,
"description": "City or neighbourhood"
},
"radius_m": {
"type": "number",
"title": "Radius M",
"default": 3000,
"maximum": 10000,
"exclusiveMinimum": 0
},
"facility_type": {
"type": "string",
"title": "Facility Type",
"default": "restaurant",
"maxLength": 100
}
}
}{
"type": "object",
"title": "FeatureCollection",
"required": [
"features"
],
"properties": {
"bbox": {
"anyOf": [
{
"type": "array",
"items": {
"type": "number"
}
},
{
"type": "null"
}
],
"title": "Bbox",
"default": null
},
"type": {
"type": "string",
"const": "FeatureCollection",
"title": "Type",
"default": "FeatureCollection"
},
"features": {
"type": "array",
"items": {
"type": "object",
"additionalProperties": true
},
"title": "Features"
},
"geospark": {
"type": "object",
"title": "Geospark",
"additionalProperties": true
}
},
"description": "An RFC 7946 GeoJSON FeatureCollection; `geospark` holds status, units, warnings, provenance."
}{
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}Prompts
0 advertised
Resources
0 advertised
30-day availability
Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.
- Successful checks
- 1 of 1 (100%)
- Average latency
- 1768 ms
- 95th percentile latency
- 1768 ms
Maintenance history
Public check and source-refresh events. Editorial and ownership records remain private.
- · probe · passed · 1768 ms · metadata changed · 21 tool(s), 0 resource(s), 0 resource template(s), 0 prompt(s)
Connect from your client
Each snippet registers the same endpoint; pick the client you use.
Claude Code
claude mcp add --transport http geospark-mcp https://geospark.terrascout.app/mcpCodex
codex mcp add geospark-mcp --url https://geospark.terrascout.app/mcpCursor
{
"mcpServers": {
"geospark-mcp": {
"url": "https://geospark.terrascout.app/mcp"
}
}
}Cline
{
"mcpServers": {
"geospark-mcp": {
"type": "streamableHttp",
"url": "https://geospark.terrascout.app/mcp",
"disabled": false
}
}
}VS Code
{
"servers": {
"geospark-mcp": {
"type": "http",
"url": "https://geospark.terrascout.app/mcp"
}
}
}Gemini CLI
gemini mcp add --transport http geospark-mcp https://geospark.terrascout.app/mcpClaude Desktop
{
"mcpServers": {
"geospark-mcp": {
"url": "https://geospark.terrascout.app/mcp"
}
}
}Windsurf
{
"mcpServers": {
"geospark-mcp": {
"serverUrl": "https://geospark.terrascout.app/mcp"
}
}
}Let your agent find its tools
Find servers like GeoSpark MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.