Map data ready for QGIS: open data extracts, GIS files, coordinates, elevation, French parcels.
Maintain this server? Claim it
This server signs you in with OAuth, which the playground doesn't support yet. Install it in your MCP client to try it.
Tool list last changed Oct 25, 2026.
Use this when the user gives coordinates and wants them in another system or format: decimal degrees, degrees minutes seconds (GPS), UTM, MGRS, Lambert 93 (EPSG:2154, the French grid) or an EPSG code, for example Lambert 93 to WGS84 latitude and longitude, or GPS coordinates to UTM. The format of each line is detected automatically, including "lat, lon" or "lon, lat"; for a national grid the numbers alone cannot reveal (Dutch RD, Swiss LV95, British National Grid, Polish 1992, Belgian Lambert 72) or a UTM zone given apart from the numbers, set source_epsg. Converts one point or up to 1,000 lines to decimal degrees, DMS, UTM and MGRS (1 m), and optionally to an EPSG code, shows them on a map, and recommends the local projected CRS for working in QGIS. Returns a CSV and a GeoJSON download (both open directly in QGIS). Needs actual coordinates: to explain what a CRS, a projection or an EPSG code is, or to write conversion code, answer without this tool. Download links build their file when opened; no file is saved. Never pass these links to open_gis_file.
| Argument |
|---|
| Type |
|---|
| Description |
|---|
| text* | string | One coordinate per line, up to 1,000 lines. A label may follow the numbers. |
| source_epsg | string | Optional system the input is in, as an EPSG code, when it cannot be detected: Dutch RD EPSG:28992, Swiss LV95 EPSG:2056, British National Grid EPSG:27700, Poland 1992 EPSG:2180, UTM zone 32N EPSG:32632, ETRS89 or ED50 UTM EPSG:25830 / EPSG:23030. Leave out to detect each line. |
| target_epsg | string | Optional extra output system as an EPSG code. |
{
"type": "object",
"examples": [
{
"text": "48.8584, 2.2945\n45.8992 N 6.1294 E",
"target_epsg": "EPSG:2154"
}
],
"required": [
"text"
],
"properties": {
"text": {
"type": "string",
"examples": [
"48.8584, 2.2945 Eiffel Tower",
"45°53'57\"N 6°07'46\"E",
"31U 448252 5411955",
"32T KR 77322 86855"
],
"description": "One coordinate per line, up to 1,000 lines. A label may follow the numbers."
},
"source_epsg": {
"type": "string",
"examples": [
"EPSG:28992",
"EPSG:32632"
],
"description": "Optional system the input is in, as an EPSG code, when it cannot be detected: Dutch RD EPSG:28992, Swiss LV95 EPSG:2056, British National Grid EPSG:27700, Poland 1992 EPSG:2180, UTM zone 32N EPSG:32632, ETRS89 or ED50 UTM EPSG:25830 / EPSG:23030. Leave out to detect each line."
},
"target_epsg": {
"type": "string",
"examples": [
"EPSG:2154",
"EPSG:3857"
],
"description": "Optional extra output system as an EPSG code."
}
}
}Use this when the user wants map data or GIS layers for a place or an area anywhere in the world, such as the data of a city, a town, a neighbourhood or a site: buildings, roads, addresses, points of interest (shops, schools, pharmacies), land use, waterways, water areas, railways, transit stops, power lines, protected areas, administrative divisions and boundaries, places or routes. The area is a place, a place with a radius, or a bbox. Returns the count, sample attributes, a map and a file (GeoJSON, KML, Shapefile zip or CSV) with its licence, ready for QGIS. One extract holds at most 20,000 features: for a town centre use a radius of about 1 km, for dense cities less. For one kind of place (pharmacies, schools, supermarkets) or land (forest, vineyards), set kind: the limit then counts that kind only, so a whole city usually fits. For administrative boundaries (a commune, the departments of a region, a country) use divisions with level and the place name, without a radius. One theme per call: extract the layers the user asks for; when they ask for the data of a place without naming a layer, or what data exists for a project, name the useful themes and let them choose before extracting several. Data: Overture Maps and OpenStreetMap. Never use the user's current location unless they type it. Give the place as the user names it (place name, address or coordinates): this tool locates it, so find_places is not needed first. Download links build their file when opened; no file is saved. Never pass these links to open_gis_file: list every format the user needs in formats, in this one call.
| Argument | Type | Description |
|---|---|---|
| area* | object | The area: a bbox, or a place (name, address or coordinates) with an optional radius in metres. The place the user asks about, not the user's own location. |
| kind | any | Keep only some kinds of feature, matched against their OpenStreetMap tag value in English: pharmacy, school, supermarket, restaurant, hospital, farmland, forest, vineyard. One kind, or several in one call (["forest", "meadow", "grass"]). Leave out for all of the theme. |
| level | string | For the divisions theme: the administrative level to keep. region = French région, US state, German Land; county = French département, US county; municipality = commune, town or city. With a named place, a division of that name at this level is returned alone, and lower levels are kept only inside the named place ("the departments of Brittany": place Brittany, level county). |
| theme* | string | The data layer. |
| formats | array | Download formats. A GeoPackage is always included. |
{
"type": "object",
"examples": [
{
"area": {
"bbox": [
2.34,
48.857,
2.343,
48.859
]
},
"theme": "buildings",
"formats": [
"shapefile"
]
},
{
"area": {
"place": "Annecy",
"radius_m": 500
},
"kind": "pharmacy",
"theme": "pois"
},
{
"area": {
"place": "Bretagne, France"
},
"level": "county",
"theme": "divisions",
"formats": [
"shapefile"
]
}
],
"required": [
"theme",
"area"
],
"properties": {
"area": {
"type": "object",
"examples": [
{
"place": "Lyon Part-Dieu",
"radius_m": 1000
},
{
"bbox": [
2.34,
48.856,
2.35,
48.862
]
}
],
"properties": {
"bbox": {
"type": "array",
"items": {
"type": "number"
},
"examples": [
[
6.12,
45.89,
6.14,
45.91
]
],
"maxItems": 4,
"minItems": 4,
"description": "[west, south, east, north] in decimal degrees (WGS 84)."
},
"place": {
"anyOf": [
{
"type": "string",
"examples": [
"Annecy, France"
]
},
{
"type": "object",
"required": [
"latitude",
"longitude"
],
"properties": {
"latitude": {
"type": "number"
},
"longitude": {
"type": "number"
}
}
}
],
"description": "A place name or address, or a point."
},
"radius_m": {
"type": "number",
"maximum": 100000,
"minimum": 1,
"examples": [
1000
],
"description": "Radius around the place in metres."
}
},
"description": "The area: a bbox, or a place (name, address or coordinates) with an optional radius in metres. The place the user asks about, not the user's own location."
},
"kind": {
"anyOf": [
{
"type": "string"
},
{
"type": "array",
"items": {
"type": "string"
},
"maxItems": 10
}
],
"description": "Keep only some kinds of feature, matched against their OpenStreetMap tag value in English: pharmacy, school, supermarket, restaurant, hospital, farmland, forest, vineyard. One kind, or several in one call ([\"forest\", \"meadow\", \"grass\"]). Leave out for all of the theme."
},
"level": {
"enum": [
"country",
"region",
"county",
"municipality"
],
"type": "string",
"description": "For the divisions theme: the administrative level to keep. region = French région, US state, German Land; county = French département, US county; municipality = commune, town or city. With a named place, a division of that name at this level is returned alone, and lower levels are kept only inside the named place (\"the departments of Brittany\": place Brittany, level county)."
},
"theme": {
"enum": [
"buildings",
"places",
"roads",
"addresses",
"divisions",
"landuse",
"pois",
"waterways",
"water_areas",
"power",
"boundaries",
"railways",
"routes",
"transit_stops",
"protected_areas"
],
"type": "string",
"description": "The data layer."
},
"formats": {
"type": "array",
"items": {
"enum": [
"geojson",
"kml",
"shapefile",
"csv",
"geopackage"
],
"type": "string"
},
"default": [
"geojson"
],
"description": "Download formats. A GeoPackage is always included."
}
}
}Use this when the user wants the coordinates (latitude and longitude, GPS position) of an address or place name, the address at given coordinates, or wants places or addresses put, pinned or plotted on an interactive map, including a whole list of addresses (up to 100, pasted or as CSV with an address column). Worldwide, OpenStreetMap data; French street addresses are refined with the national address base. Shows the points on a map; for a list, gives a CSV with latitude and longitude added (opens directly in QGIS as a delimited text layer), plus KML and GeoJSON. Not for weather, opening hours, reviews, driving or travel directions and times, property prices, or general knowledge about a place (history, facts, travel advice): answer those without this tool. Never use the user's current location unless they type it. Download links build their file when opened; no file is saved. Never pass these links to open_gis_file.
| Argument | Type | Description |
|---|---|---|
| text | string | A list as text: one address per line, or CSV with an address column. The place the user asks about, not the user's own location. |
| limit | integer | For a single query: maximum number of matches. |
| query | string | One address or place name. The place the user asks about, not the user's own location. |
| title | string | For a list: map title, also used for file names. |
| latitude | number | Latitude for a reverse lookup. The place the user asks about, not the user's own location. |
| addresses | array | A list of addresses to place, up to 100. The place the user asks about, not the user's own location. |
| longitude | number | Longitude for a reverse lookup. The place the user asks about, not the user's own location. |
{
"type": "object",
"examples": [
{
"query": "12 rue de la Paix, Annecy"
},
{
"latitude": 48.8584,
"longitude": 2.2945
},
{
"title": "Visits",
"addresses": [
"10 rue de Rivoli, Paris",
"Empire State Building, New York"
]
}
],
"properties": {
"text": {
"type": "string",
"description": "A list as text: one address per line, or CSV with an address column. The place the user asks about, not the user's own location."
},
"limit": {
"type": "integer",
"default": 5,
"maximum": 10,
"minimum": 1,
"description": "For a single query: maximum number of matches."
},
"query": {
"type": "string",
"examples": [
"12 rue de la Paix, Annecy",
"Eiffel Tower, Paris"
],
"description": "One address or place name. The place the user asks about, not the user's own location."
},
"title": {
"type": "string",
"examples": [
"Store visits"
],
"description": "For a list: map title, also used for file names."
},
"latitude": {
"type": "number",
"maximum": 90,
"minimum": -90,
"examples": [
45.8992
],
"description": "Latitude for a reverse lookup. The place the user asks about, not the user's own location."
},
"addresses": {
"type": "array",
"items": {
"type": "string"
},
"examples": [
[
"10 rue de Rivoli, Paris",
"350 Fifth Avenue, New York"
]
],
"maxItems": 100,
"minItems": 1,
"description": "A list of addresses to place, up to 100. The place the user asks about, not the user's own location."
},
"longitude": {
"type": "number",
"maximum": 180,
"minimum": -180,
"examples": [
6.1294
],
"description": "Longitude for a reverse lookup. The place the user asks about, not the user's own location."
}
}
}Use this when the user asks how tall the buildings are around an address or in a small area in France: height in metres per building, floors, main use, year built and ground altitude, from IGN BD TOPO. The area is a place with a radius (default 150 m) or a bbox, at most 0.6 km². Shows the buildings on a map with a height summary (count, median, tallest) and GeoJSON, KML, Shapefile zip or CSV downloads. France only (mainland, Corsica and overseas departments). Never use the user's current location unless they type it. Give the place as the user names it (place name, address or coordinates): this tool locates it, so find_places is not needed first. Download links build their file when opened; no file is saved. Never pass these links to open_gis_file: list every format the user needs in formats, in this one call.
| Argument | Type | Description |
|---|---|---|
| area* | object | The area: a bbox, or a place (name, address or coordinates) with an optional radius in metres. The place the user asks about, not the user's own location. |
| formats | array | Download formats. |
{
"type": "object",
"examples": [
{
"area": {
"place": "10 place Bellecour, Lyon",
"radius_m": 150
}
},
{
"area": {
"bbox": [
2.294,
48.857,
2.299,
48.86
]
},
"formats": [
"shapefile"
]
}
],
"required": [
"area"
],
"properties": {
"area": {
"type": "object",
"examples": [
{
"place": "Lyon Part-Dieu",
"radius_m": 1000
},
{
"bbox": [
2.34,
48.856,
2.35,
48.862
]
}
],
"properties": {
"bbox": {
"type": "array",
"items": {
"type": "number"
},
"examples": [
[
6.12,
45.89,
6.14,
45.91
]
],
"maxItems": 4,
"minItems": 4,
"description": "[west, south, east, north] in decimal degrees (WGS 84)."
},
"place": {
"anyOf": [
{
"type": "string",
"examples": [
"Annecy, France"
]
},
{
"type": "object",
"required": [
"latitude",
"longitude"
],
"properties": {
"latitude": {
"type": "number"
},
"longitude": {
"type": "number"
}
}
}
],
"description": "A place name or address, or a point."
},
"radius_m": {
"type": "number",
"maximum": 100000,
"minimum": 1,
"examples": [
1000
],
"description": "Radius around the place in metres."
}
},
"description": "The area: a bbox, or a place (name, address or coordinates) with an optional radius in metres. The place the user asks about, not the user's own location."
},
"formats": {
"type": "array",
"items": {
"enum": [
"geojson",
"kml",
"shapefile",
"csv"
],
"type": "string"
},
"default": [
"geojson"
],
"description": "Download formats."
}
}
}Use this when the user asks which cadastral parcel (parcelle cadastrale, plot of land) is at an address or point in France, its reference (commune, section, number) and cadastral area, or which local urban plan zone applies there (PLU or PLUi zoning: zone label, type such as U, AU, A or N, and the plan document), for example before buying land or a house or before a building project. Reads the open data of the French cadastre (DGFiP) and of the Géoportail de l'Urbanisme. Shows the parcel on a map with GeoJSON and KML downloads. France only. Never returns owners or property sales. The zone is not a building permit decision. Never use the user's current location unless they type it. Give the place as the user names it (place name, address or coordinates): this tool locates it, so find_places is not needed first. Download links build their file when opened; no file is saved. Never pass these links to open_gis_file.
| Argument | Type | Description |
|---|---|---|
| address | string | An address in France. The place the user asks about, not the user's own location. |
| latitude | number | Latitude in France. The place the user asks about, not the user's own location. |
| longitude | number | Longitude in France. The place the user asks about, not the user's own location. |
{
"type": "object",
"examples": [
{
"address": "12 rue de la Paix, Annecy"
},
{
"latitude": 48.8566,
"longitude": 2.3522
}
],
"properties": {
"address": {
"type": "string",
"examples": [
"12 rue de la Paix, Annecy"
],
"description": "An address in France. The place the user asks about, not the user's own location."
},
"latitude": {
"type": "number",
"maximum": 90,
"minimum": -90,
"examples": [
45.903488
],
"description": "Latitude in France. The place the user asks about, not the user's own location."
},
"longitude": {
"type": "number",
"maximum": 180,
"minimum": -180,
"examples": [
6.126959
],
"description": "Longitude in France. The place the user asks about, not the user's own location."
}
}
}Use this when the user asks how high a place is (altitude, height above sea level), wants an elevation profile or the climb between places (a hike, a ride or a road up a mountain: elevation gain and loss, highest and lowest points, cross-section), or asks about the terrain of an area, anywhere in the world: a DEM, relief or hillshade for QGIS, contour lines (topographic lines) and how steep or flat it is (slope). Place names work directly, for example a town and a summit. Reads the values from Copernicus DEM, a 30 m surface model of the whole world, and returns the numbers, a profile chart, the path or contours on a map and files. mode "point": up to 100 points. mode "path": 2 or more points, sampled into at most 500 samples. mode "area": a bbox, a place or a place with a radius, of any size: returns the DEM clipped to the area as a GeoTIFF (30 m, coarser for very large areas), a hillshade GeoTIFF and a slope GeoTIFF, which open directly in QGIS; for areas up to about 10 x 10 km it also returns contour lines (interval_m between lines; Shapefile, GeoJSON, KML) and slope statistics, so one call answers how steep a site is. Not for routes or travel times. Needs a place, coordinates or an area: to explain what a DEM, a DSM or contour lines are, answer without this tool. Never use the user's current location unless they type it. Give the place as the user names it (place name, address or coordinates): this tool locates it, so find_places is not needed first. Download links build their file when opened; no file is saved. Never pass these links to open_gis_file.
| Argument | Type | Description |
|---|---|---|
| area | object | For area: The area: a bbox, or a place (name, address or coordinates) with an optional radius in metres. The place the user asks about, not the user's own location. |
| mode | string | point: elevation of each point; path: profile along the points; area: DEM, hillshade and slope GeoTIFFs, plus contour lines and slope statistics for small areas. |
| points | array | For point and path: points or place names. The place the user asks about, not the user's own location. |
| samples | integer | For path: number of samples along the path. |
| interval_m | number | For area: vertical interval between contour lines, in metres. |
{
"type": "object",
"examples": [
{
"mode": "point",
"points": [
"Annecy, France"
]
},
{
"mode": "path",
"points": [
"Chamonix, France",
{
"name": "Aiguille du Midi",
"latitude": 45.8786,
"longitude": 6.8873
}
]
},
{
"area": {
"place": "Chamonix, France",
"radius_m": 2000
},
"mode": "area",
"interval_m": 50
}
],
"properties": {
"area": {
"type": "object",
"examples": [
{
"place": "Lyon Part-Dieu",
"radius_m": 1000
},
{
"bbox": [
2.34,
48.856,
2.35,
48.862
]
}
],
"properties": {
"bbox": {
"type": "array",
"items": {
"type": "number"
},
"examples": [
[
6.12,
45.89,
6.14,
45.91
]
],
"maxItems": 4,
"minItems": 4,
"description": "[west, south, east, north] in decimal degrees (WGS 84)."
},
"place": {
"anyOf": [
{
"type": "string",
"examples": [
"Annecy, France"
]
},
{
"type": "object",
"required": [
"latitude",
"longitude"
],
"properties": {
"latitude": {
"type": "number"
},
"longitude": {
"type": "number"
}
}
}
],
"description": "A place name or address, or a point."
},
"radius_m": {
"type": "number",
"maximum": 100000,
"minimum": 1,
"examples": [
1000
],
"description": "Radius around the place in metres."
}
},
"description": "For area: The area: a bbox, or a place (name, address or coordinates) with an optional radius in metres. The place the user asks about, not the user's own location."
},
"mode": {
"enum": [
"point",
"path",
"area"
],
"type": "string",
"default": "point",
"description": "point: elevation of each point; path: profile along the points; area: DEM, hillshade and slope GeoTIFFs, plus contour lines and slope statistics for small areas."
},
"points": {
"type": "array",
"items": {
"anyOf": [
{
"type": "string",
"examples": [
"Annecy, France"
]
},
{
"type": "object",
"required": [
"latitude",
"longitude"
],
"properties": {
"name": {
"type": "string"
},
"latitude": {
"type": "number"
},
"longitude": {
"type": "number"
}
}
}
]
},
"maxItems": 100,
"minItems": 1,
"description": "For point and path: points or place names. The place the user asks about, not the user's own location."
},
"samples": {
"type": "integer",
"default": 200,
"maximum": 500,
"minimum": 10,
"description": "For path: number of samples along the path."
},
"interval_m": {
"type": "number",
"default": 20,
"maximum": 1000,
"minimum": 1,
"examples": [
10,
20,
50
],
"description": "For area: vertical interval between contour lines, in metres."
}
}
}Use this when the user asks whether a forest is natural, primary, naturally regenerating, planted, a plantation or tree crops (oil palm, cocoa, coffee, rubber, orchards, agroforestry), for example for EUDR due diligence (deforestation-free sourcing, 2020 cut-off), certification, a carbon or biodiversity project or a land purchase. The area is a bbox, a place, or a place with a radius (default 1,000 m), at most about 300 km². Reads Forest Typology (ForTy) 2020 v1 by Google DeepMind, a 10 m global map, and returns the share of each class in percent and hectares (primary forest, naturally regenerating forest, planted forest, plantation forest, tree crops and agroforestry, other land), the dominant class, a map, and a GeoTIFF of the class raster clipped to the area that opens in QGIS. Caveat: 2020 baseline; planted vs naturally regenerating is the least reliable class. Not for forest loss after 2020, tree height or species. Never use the user's current location unless they type it. Download links build their file when opened; no file is saved. Never pass these links to open_gis_file.
| Argument | Type | Description |
|---|---|---|
| area* | object | The area: a bbox, or a place (name, address or coordinates) with an optional radius in metres. The place the user asks about, not the user's own location. |
{
"type": "object",
"examples": [
{
"area": {
"place": "Morcenx, France",
"radius_m": 3000
}
},
{
"area": {
"bbox": [
-60.2,
-2.6,
-60.1,
-2.5
]
}
}
],
"required": [
"area"
],
"properties": {
"area": {
"type": "object",
"examples": [
{
"place": "Lyon Part-Dieu",
"radius_m": 1000
},
{
"bbox": [
2.34,
48.856,
2.35,
48.862
]
}
],
"properties": {
"bbox": {
"type": "array",
"items": {
"type": "number"
},
"examples": [
[
6.12,
45.89,
6.14,
45.91
]
],
"maxItems": 4,
"minItems": 4,
"description": "[west, south, east, north] in decimal degrees (WGS 84)."
},
"place": {
"anyOf": [
{
"type": "string",
"examples": [
"Annecy, France"
]
},
{
"type": "object",
"required": [
"latitude",
"longitude"
],
"properties": {
"latitude": {
"type": "number"
},
"longitude": {
"type": "number"
}
}
}
],
"description": "A place name or address, or a point."
},
"radius_m": {
"type": "number",
"maximum": 100000,
"minimum": 1,
"examples": [
1000
],
"description": "Radius around the place in metres."
}
},
"description": "The area: a bbox, or a place (name, address or coordinates) with an optional radius in metres. The place the user asks about, not the user's own location."
}
}
}Use this when the user wants the driving, walking or cycling route between 2 to 25 places or points in order: the distance and travel time along the roads and paths, per leg and in total, and the route line. Computed by Valhalla on the TerraLab server from the OpenStreetMap road network, with each road's typical speed. Options avoid tolls, highways or ferries. Returns the figures (distance_m, distance_km, duration_s, duration_min), a map of the line and GeoJSON, KML, GPX, Shapefile zip and GeoPackage downloads. Not for a straight-line distance (use measure), live traffic, departure-time travel times, public transport or turn-by-turn navigation. Never use the user's current location unless they type it. Download links build their file when opened; no file is saved. Never pass these links to open_gis_file.
| Argument | Type | Description |
|---|---|---|
| mode | string | How the route is travelled. |
| points* | array | Start, optional stops and destination, in travel order: place names or {latitude, longitude}. |
| avoid_tolls | boolean | Driving: avoid toll roads where a reasonable alternative exists. |
| avoid_ferries | boolean | Avoid ferries where possible. |
| avoid_highways | boolean | Driving or cycling: avoid motorways and highways where possible. |
{
"type": "object",
"examples": [
{
"mode": "driving",
"points": [
"Annecy, France",
"Chamonix-Mont-Blanc, France"
]
},
{
"mode": "walking",
"points": [
"Lyon Part-Dieu",
"Vieux Lyon",
"Croix-Rousse, Lyon"
]
}
],
"required": [
"points"
],
"properties": {
"mode": {
"enum": [
"driving",
"walking",
"cycling"
],
"type": "string",
"default": "driving",
"description": "How the route is travelled."
},
"points": {
"type": "array",
"items": {
"anyOf": [
{
"type": "string",
"examples": [
"Annecy",
"Chamonix-Mont-Blanc"
],
"description": "Place name or address. The place the user asks about, not the user's own location."
},
{
"type": "object",
"required": [
"latitude",
"longitude"
],
"properties": {
"name": {
"type": "string"
},
"latitude": {
"type": "number",
"maximum": 90,
"minimum": -90
},
"longitude": {
"type": "number",
"maximum": 180,
"minimum": -180
}
}
}
]
},
"maxItems": 25,
"minItems": 2,
"description": "Start, optional stops and destination, in travel order: place names or {latitude, longitude}."
},
"avoid_tolls": {
"type": "boolean",
"default": false,
"description": "Driving: avoid toll roads where a reasonable alternative exists."
},
"avoid_ferries": {
"type": "boolean",
"default": false,
"description": "Avoid ferries where possible."
},
"avoid_highways": {
"type": "boolean",
"default": false,
"description": "Driving or cycling: avoid motorways and highways where possible."
}
}
}Use this when the user wants a satellite image or aerial photo of an area as a file for QGIS: a recent true colour picture, a false colour image, or NDVI to see vegetation, crops or forest health. The area is a bbox, a place, or a place with a radius. Two sources: IGN orthophotos (France only, about 0.5 to 1 m pixels, areas up to 2 x 2 km; the default inside metropolitan France for true colour) and Copernicus Sentinel-2 L2A (worldwide, 10 m, a scene every few days, areas up to 20 x 20 km; the default elsewhere and for false colour, NDVI or a date). For Sentinel-2 it picks the least cloudy scene covering the whole area in the date range (default: the last 60 days, at most 20 % cloud) and says its date, id and cloud cover. Returns a GeoTIFF in the source's own projected CRS (UTM or Lambert-93) with the licence in the file, and a preview on a map. Not for street-level photos, live weather or a picture more recent than a few days; to explain what NDVI or a band is, answer without this tool. Never use the user's current location unless they type it. Download links build their file when opened; no file is saved. Never pass these links to open_gis_file.
| Argument | Type | Description |
|---|---|---|
| area* | object | The area: a bbox, or a place (name, address or coordinates) with an optional radius in metres. The place the user asks about, not the user's own location. |
| date | string | Sentinel-2: one day, YYYY-MM-DD. |
| source | string | ign_ortho: IGN orthophotos, France only, true colour. sentinel2: Copernicus Sentinel-2, worldwide, 10 m. Default: ign_ortho inside metropolitan France for true colour without a date, sentinel2 otherwise. |
| date_to | string | Sentinel-2: end of the date range, YYYY-MM-DD. Default: today. |
| product | string | Sentinel-2 only. true_color; false_color (B08, B04, B03: vegetation in red); ndvi (float32, NaN where cloud, shadow, snow or no data). |
| date_from | string | Sentinel-2: start of the date range, YYYY-MM-DD. Default: 60 days before date_to. |
| max_cloud_percent | number | Sentinel-2: highest cloud cover of the whole scene, in percent. |
{
"type": "object",
"examples": [
{
"area": {
"place": "Annecy, France",
"radius_m": 300
}
},
{
"area": {
"place": "Annecy, France",
"radius_m": 2000
},
"source": "sentinel2",
"date_to": "2026-09-30",
"date_from": "2026-09-01"
},
{
"area": {
"place": "Beauce, France",
"radius_m": 3000
},
"product": "ndvi"
}
],
"required": [
"area"
],
"properties": {
"area": {
"type": "object",
"examples": [
{
"place": "Lyon Part-Dieu",
"radius_m": 1000
},
{
"bbox": [
2.34,
48.856,
2.35,
48.862
]
}
],
"properties": {
"bbox": {
"type": "array",
"items": {
"type": "number"
},
"examples": [
[
6.12,
45.89,
6.14,
45.91
]
],
"maxItems": 4,
"minItems": 4,
"description": "[west, south, east, north] in decimal degrees (WGS 84)."
},
"place": {
"anyOf": [
{
"type": "string",
"examples": [
"Annecy, France"
]
},
{
"type": "object",
"required": [
"latitude",
"longitude"
],
"properties": {
"latitude": {
"type": "number"
},
"longitude": {
"type": "number"
}
}
}
],
"description": "A place name or address, or a point."
},
"radius_m": {
"type": "number",
"maximum": 100000,
"minimum": 1,
"examples": [
1000
],
"description": "Radius around the place in metres."
}
},
"description": "The area: a bbox, or a place (name, address or coordinates) with an optional radius in metres. The place the user asks about, not the user's own location."
},
"date": {
"type": "string",
"examples": [
"2026-09-15"
],
"description": "Sentinel-2: one day, YYYY-MM-DD."
},
"source": {
"enum": [
"sentinel2",
"ign_ortho"
],
"type": "string",
"description": "ign_ortho: IGN orthophotos, France only, true colour. sentinel2: Copernicus Sentinel-2, worldwide, 10 m. Default: ign_ortho inside metropolitan France for true colour without a date, sentinel2 otherwise."
},
"date_to": {
"type": "string",
"description": "Sentinel-2: end of the date range, YYYY-MM-DD. Default: today."
},
"product": {
"enum": [
"true_color",
"false_color",
"ndvi"
],
"type": "string",
"default": "true_color",
"description": "Sentinel-2 only. true_color; false_color (B08, B04, B03: vegetation in red); ndvi (float32, NaN where cloud, shadow, snow or no data)."
},
"date_from": {
"type": "string",
"description": "Sentinel-2: start of the date range, YYYY-MM-DD. Default: 60 days before date_to."
},
"max_cloud_percent": {
"type": "number",
"default": 20,
"maximum": 100,
"minimum": 0,
"description": "Sentinel-2: highest cloud cover of the whole scene, in percent."
}
}
}Use this when the user wants the area reachable from 1 to 10 places within a travel time or a distance along the roads (an isochrone, catchment or service area): for example everything within 5, 10 and 20 minutes on foot from a station, or 30 km by car. Driving, walking or cycling, computed by Valhalla on the TerraLab server from the OpenStreetMap road network with each road's typical speed. Returns one polygon per start and value, with fields start, minutes or km, and mode, a map, and GeoJSON, KML, Shapefile zip and GeoPackage downloads. Up to 4 values, at most 120 minutes or 200 km. Not for a circle of a fixed radius (use measure), live traffic, a given departure time or public transport. Never use the user's current location unless they type it. Download links build their file when opened; no file is saved. Never pass these links to open_gis_file.
| Argument | Type | Description |
|---|---|---|
| km | array | Distances along the roads in km, instead of minutes. |
| mode | string | How the area is travelled. |
| starts* | array | Start places or points: place names or {latitude, longitude}. |
| minutes | array | Travel times in minutes, one polygon each. Leave out when km is given. |
{
"type": "object",
"examples": [
{
"mode": "walking",
"starts": [
"Gare d'Annecy"
],
"minutes": [
15,
30
]
},
{
"km": [
10,
25
],
"mode": "driving",
"starts": [
"Lyon Part-Dieu",
"Grenoble"
]
}
],
"required": [
"starts"
],
"properties": {
"km": {
"type": "array",
"items": {
"type": "number",
"maximum": 200,
"exclusiveMinimum": 0
},
"maxItems": 4,
"description": "Distances along the roads in km, instead of minutes."
},
"mode": {
"enum": [
"driving",
"walking",
"cycling"
],
"type": "string",
"default": "driving",
"description": "How the area is travelled."
},
"starts": {
"type": "array",
"items": {
"anyOf": [
{
"type": "string",
"examples": [
"Gare d'Annecy"
],
"description": "Place name or address. The place the user asks about, not the user's own location."
},
{
"type": "object",
"required": [
"latitude",
"longitude"
],
"properties": {
"name": {
"type": "string"
},
"latitude": {
"type": "number",
"maximum": 90,
"minimum": -90
},
"longitude": {
"type": "number",
"maximum": 180,
"minimum": -180
}
}
}
]
},
"maxItems": 10,
"minItems": 1,
"description": "Start places or points: place names or {latitude, longitude}."
},
"minutes": {
"type": "array",
"items": {
"type": "number",
"maximum": 120,
"exclusiveMinimum": 0
},
"default": [
5,
10,
20
],
"maxItems": 4,
"description": "Travel times in minutes, one polygon each. Leave out when km is given."
}
}
}Use this when the user wants a straight-line (as the crow flies) distance between places with midpoint and bearing, the length of a drawn line, the area and perimeter of a polygon, a circle of a given radius around a place, or a buffer of a given width around a drawn line or polygon. Distances and areas are geodesic on the WGS 84 ellipsoid, buffers are built in a local equidistant projection; every figure states its unit (m, km, m², ha, km²). method "distance" takes 2 or more points or place names, or a line in geometry; "area" takes 3 or more points or a polygon in geometry; "radius" takes a center and radius_m; "buffer" takes a geometry and radius_m. Not a road or travel distance. Returns the numbers, a map and GeoJSON, KML, Shapefile zip or CSV downloads. Never use the user's current location unless they type it. Give the place as the user names it (place name, address or coordinates): this tool locates it, so find_places is not needed first. Download links build their file when opened; no file is saved. Never pass these links to open_gis_file: list every format the user needs in formats, in this one call.
| Argument | Type | Description |
|---|---|---|
| center | any | For radius: the center, a point or a place name. The place the user asks about, not the user's own location. |
| method* | string | What to measure. |
| points | array | For distance (2+) and area (3+): points or place names in order. The place the user asks about, not the user's own location. |
| formats | array | Download formats. |
| geometry | object | A drawn geometry as GeoJSON (Point, LineString, Polygon, MultiLineString or MultiPolygon, WGS 84 longitude, latitude), or a Feature holding one. |
| radius_m | number | For radius and buffer: the distance in metres (convert km or miles to metres first). |
{
"type": "object",
"examples": [
{
"method": "distance",
"points": [
"Paris, France",
"Geneva, Switzerland"
]
},
{
"center": "Lyon Part-Dieu",
"method": "radius",
"radius_m": 5000
},
{
"method": "area",
"points": [
{
"latitude": 45.9,
"longitude": 6.12
},
{
"latitude": 45.9,
"longitude": 6.13
},
{
"latitude": 45.91,
"longitude": 6.13
}
]
},
{
"method": "buffer",
"geometry": {
"type": "LineString",
"coordinates": [
[
2.35,
48.85
],
[
2.36,
48.86
]
]
},
"radius_m": 500
}
],
"required": [
"method"
],
"properties": {
"center": {
"anyOf": [
{
"type": "string",
"examples": [
"Paris",
"Geneva"
],
"description": "Place name or address. The place the user asks about, not the user's own location."
},
{
"type": "object",
"required": [
"latitude",
"longitude"
],
"properties": {
"name": {
"type": "string"
},
"latitude": {
"type": "number",
"maximum": 90,
"minimum": -90
},
"longitude": {
"type": "number",
"maximum": 180,
"minimum": -180
}
}
}
],
"description": "For radius: the center, a point or a place name. The place the user asks about, not the user's own location."
},
"method": {
"enum": [
"distance",
"area",
"radius",
"buffer"
],
"type": "string",
"description": "What to measure."
},
"points": {
"type": "array",
"items": {
"anyOf": [
{
"type": "string",
"examples": [
"Paris",
"Geneva"
],
"description": "Place name or address. The place the user asks about, not the user's own location."
},
{
"type": "object",
"required": [
"latitude",
"longitude"
],
"properties": {
"name": {
"type": "string"
},
"latitude": {
"type": "number",
"maximum": 90,
"minimum": -90
},
"longitude": {
"type": "number",
"maximum": 180,
"minimum": -180
}
}
}
]
},
"maxItems": 500,
"minItems": 2,
"description": "For distance (2+) and area (3+): points or place names in order. The place the user asks about, not the user's own location."
},
"formats": {
"type": "array",
"items": {
"enum": [
"geojson",
"kml",
"shapefile",
"csv"
],
"type": "string"
},
"default": [
"geojson",
"kml"
],
"description": "Download formats."
},
"geometry": {
"type": "object",
"examples": [
{
"type": "LineString",
"coordinates": [
[
2.35,
48.85
],
[
2.36,
48.86
]
]
}
],
"properties": {
"type": {
"type": "string"
},
"geometry": {
"type": "object"
},
"coordinates": {
"type": "array"
}
},
"description": "A drawn geometry as GeoJSON (Point, LineString, Polygon, MultiLineString or MultiPolygon, WGS 84 longitude, latitude), or a Feature holding one."
},
"radius_m": {
"type": "number",
"maximum": 2000000,
"minimum": 1,
"examples": [
5000
],
"description": "For radius and buffer: the distance in metres (convert km or miles to metres first)."
}
}
}Use this when the user shares or links a geographic file (GeoJSON, KML, KMZ, GPX track, zipped Shapefile, CSV with coordinates, WKT), pastes its content, or has a list of points or GeoJSON to put on a map, and wants to see it, understand it (format, coordinate system, extent, feature count, geometry types, fields, problems) or convert it to GeoJSON, KML, KMZ, GPX, Shapefile zip or CSV, for example a GPX track to a Shapefile or a KML to GeoJSON. Shapefile, GeoJSON, KML and CSV outputs open directly in QGIS. Also covers long tracks or point lists too big to write in the chat. Not for fetching new data about a place: that is extract_open_data. Files up to 50 MB. Never use the user's current location unless they type it. Download links build their file when opened; no file is saved. TerraLab reads the file or link to answer and keeps no copy.
| Argument | Type | Description |
|---|---|---|
| url | string | A public http(s) link to the file. |
| file | object | A file uploaded in the conversation. |
| text | string | The file content pasted as text (GeoJSON, KML, GPX, CSV or WKT). |
| title | string | Name for the map and the output files when there is no file name. |
| points | array | Points to show and convert, with a name. The places the user asks about, not the user's own location. |
| geojson | object | A GeoJSON FeatureCollection, Feature or geometry in WGS 84, given as an object. |
| file_name | string | Optional name of the file, used to name the outputs. |
| convert_to | array | Output formats wanted. |
{
"type": "object",
"examples": [
{
"text": "<kml xmlns=\"http://www.opengis.net/kml/2.2\"><Placemark><name>A</name><Point><coordinates>6.12,45.9</coordinates></Point></Placemark></kml>",
"convert_to": [
"gpx"
]
}
],
"properties": {
"url": {
"type": "string",
"examples": [
"https://example.com/trail.gpx"
],
"description": "A public http(s) link to the file."
},
"file": {
"type": "object",
"required": [
"download_url",
"file_id"
],
"properties": {
"file_id": {
"type": "string"
},
"file_name": {
"type": "string"
},
"mime_type": {
"type": "string"
},
"download_url": {
"type": "string"
}
},
"description": "A file uploaded in the conversation."
},
"text": {
"type": "string",
"description": "The file content pasted as text (GeoJSON, KML, GPX, CSV or WKT)."
},
"title": {
"type": "string",
"examples": [
"Client sites"
],
"description": "Name for the map and the output files when there is no file name."
},
"points": {
"type": "array",
"items": {
"type": "object",
"required": [
"latitude",
"longitude"
],
"properties": {
"name": {
"type": "string"
},
"latitude": {
"type": "number",
"maximum": 90,
"minimum": -90
},
"longitude": {
"type": "number",
"maximum": 180,
"minimum": -180
},
"description": {
"type": "string"
}
}
},
"examples": [
[
{
"name": "Annecy station",
"latitude": 45.9017,
"longitude": 6.1217
}
]
],
"maxItems": 5000,
"description": "Points to show and convert, with a name. The places the user asks about, not the user's own location."
},
"geojson": {
"type": "object",
"description": "A GeoJSON FeatureCollection, Feature or geometry in WGS 84, given as an object."
},
"file_name": {
"type": "string",
"examples": [
"trail.gpx"
],
"description": "Optional name of the file, used to name the outputs."
},
"convert_to": {
"type": "array",
"items": {
"enum": [
"geojson",
"kml",
"kmz",
"gpx",
"shapefile",
"csv"
],
"type": "string"
},
"examples": [
[
"gpx"
],
[
"kml",
"shapefile"
]
],
"description": "Output formats wanted."
}
}
}Use this when the user wants to apply one GIS operation to a set of features (an uploaded file, a link, inline GeoJSON, or a download link from another TerraLab answer) and get the result as a file: buffer every feature by radius_m, union (dissolve all features into one, or one per value of dissolve_field), intersection or difference with a second layer, clip to a second layer or to an area (place, place with radius_m, or bbox), simplify by tolerance_m, centroid of each feature, or area_length (adds area_m2, perimeter_m and length_m to each feature, geodesic). Overlays run in WGS 84 degrees; buffer, simplify and centroid in a local equidistant projection. Up to 20,000 features and 100,000 vertices (10,000 for buffer). Returns the feature count, geometry types, total area or length, a map and GeoJSON, KML, Shapefile zip, GeoPackage and CSV downloads. Not for one distance or the area of a shape drawn in the chat: that is measure. Not for reading or converting a file without changing its geometry: that is open_gis_file. Never use the user's current location unless they type it. Download links build their file when opened; no file is saved. Never pass these links to open_gis_file: list every format the user needs in formats, in this one call. TerraLab reads the file or link to answer and keeps no copy.
| Argument | Type | Description |
|---|---|---|
| url | string | A public http(s) link to the features, or a TerraLab download link from an earlier answer. |
| area | object | For clip: the area to keep, as a bbox or a place with a radius (its bounding box is used). The place the user asks about, not the user's own location. |
| file | object | A file uploaded in the conversation (GeoJSON, KML, KMZ, GPX, zipped Shapefile, CSV or WKT). |
| title | string | Name for the map and the output files. |
| formats | array | Download formats. All five by default. |
| geojson | object | The features as a GeoJSON FeatureCollection, Feature or geometry in WGS 84 (longitude, latitude). |
| radius_m | number | For buffer: the distance in metres (convert km or miles first). |
| with_url | string | For intersection, difference and clip: a link to the second layer, or a TerraLab download link. |
| operation* | string | The operation to apply. |
| with_file | object | For intersection, difference and clip: the second layer, uploaded in the conversation. |
| tolerance_m | number | For simplify: the largest allowed shift of the outline in metres. |
| with_geojson | object | For intersection, difference and clip: the second layer as GeoJSON in WGS 84. Only its polygons count. |
| dissolve_field | string | For union: dissolve into one feature per value of this field instead of one feature. |
{
"type": "object",
"examples": [
{
"geojson": {
"type": "LineString",
"coordinates": [
[
6.12,
45.9
],
[
6.13,
45.905
]
]
},
"radius_m": 200,
"operation": "buffer"
},
{
"url": "https://mcp.terra-lab.ai/dl/geojson/TOKEN/buildings.geojson",
"area": {
"place": "Annecy",
"radius_m": 150
},
"operation": "clip"
}
],
"required": [
"operation"
],
"properties": {
"url": {
"type": "string",
"description": "A public http(s) link to the features, or a TerraLab download link from an earlier answer."
},
"area": {
"type": "object",
"examples": [
{
"place": "Lyon Part-Dieu",
"radius_m": 1000
},
{
"bbox": [
2.34,
48.856,
2.35,
48.862
]
}
],
"properties": {
"bbox": {
"type": "array",
"items": {
"type": "number"
},
"examples": [
[
6.12,
45.89,
6.14,
45.91
]
],
"maxItems": 4,
"minItems": 4,
"description": "[west, south, east, north] in decimal degrees (WGS 84)."
},
"place": {
"anyOf": [
{
"type": "string",
"examples": [
"Annecy, France"
]
},
{
"type": "object",
"required": [
"latitude",
"longitude"
],
"properties": {
"latitude": {
"type": "number"
},
"longitude": {
"type": "number"
}
}
}
],
"description": "A place name or address, or a point."
},
"radius_m": {
"type": "number",
"maximum": 100000,
"minimum": 1,
"examples": [
1000
],
"description": "Radius around the place in metres."
}
},
"description": "For clip: the area to keep, as a bbox or a place with a radius (its bounding box is used). The place the user asks about, not the user's own location."
},
"file": {
"type": "object",
"required": [
"download_url",
"file_id"
],
"properties": {
"file_id": {
"type": "string"
},
"file_name": {
"type": "string"
},
"mime_type": {
"type": "string"
},
"download_url": {
"type": "string"
}
},
"description": "A file uploaded in the conversation (GeoJSON, KML, KMZ, GPX, zipped Shapefile, CSV or WKT)."
},
"title": {
"type": "string",
"examples": [
"Buildings near the station"
],
"description": "Name for the map and the output files."
},
"formats": {
"type": "array",
"items": {
"enum": [
"geojson",
"kml",
"shapefile",
"geopackage",
"csv"
],
"type": "string"
},
"description": "Download formats. All five by default."
},
"geojson": {
"type": "object",
"description": "The features as a GeoJSON FeatureCollection, Feature or geometry in WGS 84 (longitude, latitude)."
},
"radius_m": {
"type": "number",
"maximum": 100000,
"minimum": 0.1,
"examples": [
200
],
"description": "For buffer: the distance in metres (convert km or miles first)."
},
"with_url": {
"type": "string",
"description": "For intersection, difference and clip: a link to the second layer, or a TerraLab download link."
},
"operation": {
"enum": [
"buffer",
"union",
"intersection",
"difference",
"clip",
"simplify",
"centroid",
"area_length"
],
"type": "string",
"description": "The operation to apply."
},
"with_file": {
"type": "object",
"required": [
"download_url",
"file_id"
],
"properties": {
"file_id": {
"type": "string"
},
"file_name": {
"type": "string"
},
"mime_type": {
"type": "string"
},
"download_url": {
"type": "string"
}
},
"description": "For intersection, difference and clip: the second layer, uploaded in the conversation."
},
"tolerance_m": {
"type": "number",
"maximum": 100000,
"minimum": 0.01,
"examples": [
5
],
"description": "For simplify: the largest allowed shift of the outline in metres."
},
"with_geojson": {
"type": "object",
"description": "For intersection, difference and clip: the second layer as GeoJSON in WGS 84. Only its polygons count."
},
"dissolve_field": {
"type": "string",
"description": "For union: dissolve into one feature per value of this field instead of one feature."
}
}
}