Query elevation values from 100 GB+ GeoTIFF and COG datasets via a simple REST API or directly through your AI assistant using MCP. Sub-second reads. Pay-per-query.
All datasets are stored as Cloud Optimised GeoTIFFs (COG), enabling sub-second random pixel access without loading the entire file. Spatial metadata is always one API call away.
Every endpoint accepts an X-API-Key header. GET is great for quick browser
tests and simple integrations; POST supports JSON bodies and batch queries up to 100 points.
# Single point — simplest form curl -s "https://api.geospatialsystem.com/query?\ lat=-33.8688\ &lon=151.2093\ &dataset_id=file1_elevation" \ -H "X-API-Key: grk_YOUR_KEY" # Specific band curl -s "https://api.geospatialsystem.com/query?\ lat=-27.47\ &lon=153.02\ &dataset_id=file2_elevation\ &band=1" \ -H "X-API-Key: grk_YOUR_KEY" # List all datasets curl "https://api.geospatialsystem.com/datasets" \ -H "X-API-Key: grk_YOUR_KEY" # Dataset spatial metadata curl "https://api.geospatialsystem.com/datasets/file1_elevation" \ -H "X-API-Key: grk_YOUR_KEY"
# Single point — POST JSON body curl -s -X POST \ "https://api.geospatialsystem.com/query" \ -H "Content-Type: application/json" \ -H "X-API-Key: grk_YOUR_KEY" \ -d '{ "lat": -33.8688, "lon": 151.2093, "dataset_id": "file1_elevation", "band": 1 }' # Batch — up to 100 points in one request curl -s -X POST \ "https://api.geospatialsystem.com/query/batch" \ -H "Content-Type: application/json" \ -H "X-API-Key: grk_YOUR_KEY" \ -d '{"queries": [ {"lat":-33.87,"lon":151.21,"dataset_id":"file1_elevation"}, {"lat":-27.47,"lon":153.02,"dataset_id":"file2_elevation"}, {"lat":-37.81,"lon":144.96,"dataset_id":"file3_elevation"} ]}'
import requests BASE = "https://api.geospatialsystem.com" HEADS = {"X-API-Key": "grk_YOUR_KEY"} # Single GET r = requests.get(f"{BASE}/query", headers=HEADS, params={ "lat": -33.8688, "lon": 151.2093, "dataset_id": "file1_elevation" }) print(r.json()) # {"value": 42.7, "units": "metres", ...} # Batch POST points = [ {"lat": -33.87, "lon": 151.21, "dataset_id": "file1_elevation"}, {"lat": -27.47, "lon": 153.02, "dataset_id": "file2_elevation"}, ] r = requests.post(f"{BASE}/query/batch", headers=HEADS, json={"queries": points}) for result in r.json()["results"]: print(result["value"], result["units"])
Every layer of the stack is chosen for throughput, reliability, and minimal egress cost.
Add GeoRaster as an MCP tool in Claude Desktop, Cursor, or any compatible client. Ask "What is the elevation at Sydney Harbour?" and the AI queries the API for you.
conda env create -f environment.yml
Installs rasterio, FastMCP, and all dependencies.
Point the "georaster" server entry at mcp_server.py
with DATA_DIR set to your raster folder.
The 🌐 GeoRaster MCP tools appear automatically in the tool panel.
"What is the elevation at these 5 coordinates?" — Claude calls
batch_query and returns a formatted table.
{
"mcpServers": {
"georaster": {
"command": "/opt/conda/envs/georaster/bin/python",
"args": ["/opt/georaster/mcp/mcp_server.py"],
"env": {
"DATA_DIR": "/data/rasters"
}
}
}
}
// Remote server (SSE transport)
{
"mcpServers": {
"georaster-remote": {
"url": "https://api.geospatialsystem.com/mcp/sse",
"transport": "sse"
}
}
}
Start free. Scale as you grow. No surprise bills.