ICOS atmosphere, ocean and ecosystem greenhouse-gas observations, with citation and DOI per answer
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Statistics over a WHOLE selection, computed on the server: count, mean, min, max, sum and standard deviation of one variable, overall or per station, year, month or day. Use this for any average, total, range or trend instead of reading rows. Any size: a selection over 500,000 rows is split by time on the server and merged exactly. `std` is the POPULATION standard deviation (ddof 0). `sum` adds the values as stored, which is a total only for values that are themselves totals per row: summing a RATE (umol m-2 s-1 per half-hour, gC m-2 d-1 per day) or a concentration gives no physical quantity -- for a flux total multiply the mean by the period.
a variable id from search_variables
the groups: none (one result), station, a period, or both
ISO date or datetime, EXCLUSIVE
ISO date or datetime, inclusive (2025-01-01)
cruise expocodes, a list or a string; ocean observation tables only
station ids -- a list, or one id (or several, comma-separated) as a string; CASE-SENSITIVE: HTM150 (trigram + sampling height) for atmosphere, SE-Htm for FLUXNET sites
DEFAULT TRUE: drop the observations the store's recommended quality control rejects; false keeps every observation, flagged ones included
Pick your client. Values in capitals, like YOUR_TOKEN, are yours to fill in.
claude mcp add --transport http icos https://mcp.icos-cp.eu/mcp
Statistics over a WHOLE selection, computed on the server: count, mean, min, max, sum and standard deviation of one variable, overall or per station, year, month or day. Use this for any average, total, range or trend instead of reading rows. Any size: a selection over 500,000 rows is split by time on the server and merged exactly. `std` is the POPULATION standard deviation (ddof 0). `sum` adds the values as stored, which is a total only for values that are themselves totals per row: summing a RATE (umol m-2 s-1 per half-hour, gC m-2 d-1 per day) or a concentration gives no physical quantity -- for a flux total multiply the mean by the period.
| Argument | Type | Description |
|---|---|---|
| by | string | the groups: none (one result), station, a period, or both |
| id* | string | a variable id from search_variables |
| end | any | ISO date or datetime, EXCLUSIVE |
| start | any | ISO date or datetime, inclusive (2025-01-01) |
| cruise | any | cruise expocodes, a list or a string; ocean observation tables only |
| lat_max | any | |
| lat_min | any | |
| lon_max | any | |
| lon_min | any | |
| station | any | station ids -- a list, or one id (or several, comma-separated) as a string; CASE-SENSITIVE: HTM150 (trigram + sampling height) for atmosphere, SE-Htm for FLUXNET sites |
| apply_qc | boolean | DEFAULT TRUE: drop the observations the store's recommended quality control rejects; false keeps every observation, flagged ones included |
| height_max | any | |
| height_min | any |
{
"type": "object",
"title": "aggregateArguments",
"required": [
"id"
],
"properties": {
"by": {
"enum": [
"none",
"station",
"year",
"month",
"day",
"station_year",
"station_month"
],
"type": "string",
"title": "By",
"default": "none",
"description": "the groups: none (one result), station, a period, or both"
},
"id": {
"type": "string",
"title": "Id",
"description": "a variable id from search_variables"
},
"end": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "End",
"default": null,
"description": "ISO date or datetime, EXCLUSIVE"
},
"start": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Start",
"default": null,
"description": "ISO date or datetime, inclusive (2025-01-01)"
},
"cruise": {
"anyOf": [
{
"type": "array",
"items": {
"type": "string"
}
},
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Cruise",
"default": null,
"description": "cruise expocodes, a list or a string; ocean observation tables only"
},
"lat_max": {
"anyOf": [
{
"type": "number",
"maximum": 90,
"minimum": -90
},
{
"type": "null"
}
],
"title": "Lat Max",
"default": null
},
"lat_min": {
"anyOf": [
{
"type": "number",
"maximum": 90,
"minimum": -90
},
{
"type": "null"
}
],
"title": "Lat Min",
"default": null
},
"lon_max": {
"anyOf": [
{
"type": "number",
"maximum": 180,
"minimum": -180
},
{
"type": "null"
}
],
"title": "Lon Max",
"default": null
},
"lon_min": {
"anyOf": [
{
"type": "number",
"maximum": 180,
"minimum": -180
},
{
"type": "null"
}
],
"title": "Lon Min",
"default": null
},
"station": {
"anyOf": [
{
"type": "array",
"items": {
"type": "string"
}
},
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Station",
"default": null,
"description": "station ids -- a list, or one id (or several, comma-separated) as a string; CASE-SENSITIVE: HTM150 (trigram + sampling height) for atmosphere, SE-Htm for FLUXNET sites"
},
"apply_qc": {
"type": "boolean",
"title": "Apply Qc",
"default": true,
"description": "DEFAULT TRUE: drop the observations the store's recommended quality control rejects; false keeps every observation, flagged ones included"
},
"height_max": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"title": "Height Max",
"default": null
},
"height_min": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"title": "Height Min",
"default": null
}
}
}One variable in full: names, unit, which dataset, its coverage, how its quality flag is read, licence and DOI. For a multi-dimensional variable read through zarr (access 'zarr'), its axes with their labels, the slice /query serves (prescribed) and an xarray line for any other slice.
| Argument | Type | Description |
|---|---|---|
| id* | string | a variable id from search_variables |
{
"type": "object",
"title": "describe_variableArguments",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"title": "Id",
"description": "a variable id from search_variables"
}
}
}How big a selection is -- rows, stations, time span -- without fetching it. Call this before get_data.
| Argument | Type | Description |
|---|---|---|
| id* | string | a variable id from search_variables |
| end | any | ISO date or datetime, EXCLUSIVE |
| start | any | ISO date or datetime, inclusive (2025-01-01) |
| cruise | any | cruise expocodes, a list or a string; ocean observation tables only |
| lat_max | any | |
| lat_min | any | |
| lon_max | any | |
| lon_min | any | |
| station | any | station ids -- a list, or one id (or several, comma-separated) as a string; CASE-SENSITIVE: HTM150 (trigram + sampling height) for atmosphere, SE-Htm for FLUXNET sites |
| apply_qc | boolean |
The stations that carry a variable: id, name, position, sampling height, country, ecosystem -- near a point (sorted by distance), in a box, by name or by country. The ids are what estimate and get_data take as station=.
| Argument | Type | Description |
|---|---|---|
| id* | string | a station-based variable id from search_variables |
| text | any | part of a station's id or name, e.g. 'Hyltemossa', 'HTM', 'Hyy' |
| limit | integer | |
| country | any | two-letter code, e.g. SE |
| lat_max | any | |
| lat_min | any | |
| lon_max | any | |
| lon_min | any | |
| near_lat | any | search around this point, with near_lon and radius_km |
| near_lon | any |
How to cite a variable's data: the citation text, licence and DOI from its data passport, and -- for a selection (stations, a time window, a box) -- every data object it came from, in full. Data answers carry a short citation and only the COUNT of their sources; this lists them.
| Argument | Type | Description |
|---|---|---|
| id* | string | a variable id from search_variables |
| end | any | ISO date or datetime, EXCLUSIVE |
| start | any | ISO date or datetime, inclusive (2025-01-01) |
| lat_max | any | |
| lat_min | any | |
| lon_max | any | |
| lon_min | any | |
| station | any | station ids -- a list, or one id (or several, comma-separated) as a string; CASE-SENSITIVE: HTM150 (trigram + sampling height) for atmosphere, SE-Htm for FLUXNET sites |
{
"type": "object",
"title": "get_citationArguments",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"title": "Id",
"description": "a variable id from search_variables"
},
"end": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "End",
"default": null,
"description": "ISO date or datetime, EXCLUSIVE"
},
"start": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Start",
"default": null,
"description": "ISO date or datetime, inclusive (2025-01-01)"
},
"lat_max": {
"anyOf": [
{
"type": "number",
"maximum": 90,
"minimum": -90
},
{
"type": "null"
}
],
"title": "Lat Max",
"default": null
},
"lat_min": {
"anyOf": [
{
"type": "number",
"maximum": 90,
"minimum": -90
},
{
"type": "null"
}
],
"title": "Lat Min",
"default": null
},
"lon_max": {
"anyOf": [
{
"type": "number",
"maximum": 180,
"minimum": -180
},
{
"type": "null"
}
],
"title": "Lon Max",
"default": null
},
"lon_min": {
"anyOf": [
{
"type": "number",
"maximum": 180,
"minimum": -180
},
{
"type": "null"
}
],
"title": "Lon Min",
"default": null
},
"station": {
"anyOf": [
{
"type": "array",
"items": {
"type": "string"
}
},
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Station",
"default": null,
"description": "station ids -- a list, or one id (or several, comma-separated) as a string; CASE-SENSITIVE: HTM150 (trigram + sampling height) for atmosphere, SE-Htm for FLUXNET sites"
}
}
}Observations for one variable, filtered by box, time, station, cruise, height and quality control. Returns at most max_rows rows as a table, the total, a download URL for the whole selection, and the citation the user must be given with any use of the data.
| Argument | Type | Description |
|---|---|---|
| id* | string | a variable id from search_variables |
| end | any | ISO date or datetime, EXCLUSIVE |
| start | any | ISO date or datetime, inclusive (2025-01-01) |
| cruise | any | cruise expocodes, a list or a string; ocean observation tables only |
| lat_max | any | |
| lat_min | any | |
| lon_max | any | |
| lon_min | any | |
| station | any | station ids -- a list, or one id (or several, comma-separated) as a string; CASE-SENSITIVE: HTM150 (trigram + sampling height) for atmosphere, SE-Htm for FLUXNET sites |
List the ICOS datasets: one per data store, with domain (atmosphere, ocean, ecosystem), time and space coverage, licence and DOI.
No arguments.
{
"type": "object",
"title": "list_datasetsArguments",
"properties": {}
}Find variable ids in the ICOS catalogue by name, quantity or unit. The ids are what estimate and get_data take. Primary measurements come before their companions (standard deviation, value counts, flags).
| Argument | Type | Description |
|---|---|---|
| text* | string | what to look for: a gas, a quantity or a name, e.g. 'co2', 'methane', 'net ecosystem exchange', 'fCO2' |
| limit | integer | |
| store | any | limit to one store, e.g. icos-obspack.zarr |
| domain | any | atmosphere, ocean or ecosystem |
{
"type": "object",
"title": "search_variablesArguments",
"required": [
"text"
],
"properties": {
"text": {
"type": "string",
"title": "Text",
"description": "what to look for: a gas, a quantity or a name, e.g. 'co2', 'methane', 'net ecosystem exchange', 'fCO2'"
},
"limit": {
"type": "integer",
"title": "Limit",
"default": 15,
"maximum": 50,
"minimum": 1
},
"store": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Store",
"default": null,
"description": "limit to one store, e.g. icos-obspack.zarr"
},
"domain": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Domain",
"default": null,
"description": "atmosphere, ocean or ecosystem"
}
}
}We read every tool's name, description and inputs the way the model will, looking for instructions hidden from you. A clean result means no warning signs, not a guarantee. Scanned Oct 30, 2026.
| DEFAULT TRUE: drop the observations the store's recommended quality control rejects; false keeps every observation, flagged ones included |
| height_max | any |
| height_min | any |
{
"type": "object",
"title": "estimateArguments",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"title": "Id",
"description": "a variable id from search_variables"
},
"end": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "End",
"default": null,
"description": "ISO date or datetime, EXCLUSIVE"
},
"start": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Start",
"default": null,
"description": "ISO date or datetime, inclusive (2025-01-01)"
},
"cruise": {
"anyOf": [
{
"type": "array",
"items": {
"type": "string"
}
},
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Cruise",
"default": null,
"description": "cruise expocodes, a list or a string; ocean observation tables only"
},
"lat_max": {
"anyOf": [
{
"type": "number",
"maximum": 90,
"minimum": -90
},
{
"type": "null"
}
],
"title": "Lat Max",
"default": null
},
"lat_min": {
"anyOf": [
{
"type": "number",
"maximum": 90,
"minimum": -90
},
{
"type": "null"
}
],
"title": "Lat Min",
"default": null
},
"lon_max": {
"anyOf": [
{
"type": "number",
"maximum": 180,
"minimum": -180
},
{
"type": "null"
}
],
"title": "Lon Max",
"default": null
},
"lon_min": {
"anyOf": [
{
"type": "number",
"maximum": 180,
"minimum": -180
},
{
"type": "null"
}
],
"title": "Lon Min",
"default": null
},
"station": {
"anyOf": [
{
"type": "array",
"items": {
"type": "string"
}
},
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Station",
"default": null,
"description": "station ids -- a list, or one id (or several, comma-separated) as a string; CASE-SENSITIVE: HTM150 (trigram + sampling height) for atmosphere, SE-Htm for FLUXNET sites"
},
"apply_qc": {
"type": "boolean",
"title": "Apply Qc",
"default": true,
"description": "DEFAULT TRUE: drop the observations the store's recommended quality control rejects; false keeps every observation, flagged ones included"
},
"height_max": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"title": "Height Max",
"default": null
},
"height_min": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"title": "Height Min",
"default": null
}
}
}| radius_km | number |
{
"type": "object",
"title": "find_stationsArguments",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"title": "Id",
"description": "a station-based variable id from search_variables"
},
"text": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Text",
"default": null,
"description": "part of a station's id or name, e.g. 'Hyltemossa', 'HTM', 'Hyy'"
},
"limit": {
"type": "integer",
"title": "Limit",
"default": 50,
"maximum": 200,
"minimum": 1
},
"country": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Country",
"default": null,
"description": "two-letter code, e.g. SE"
},
"lat_max": {
"anyOf": [
{
"type": "number",
"maximum": 90,
"minimum": -90
},
{
"type": "null"
}
],
"title": "Lat Max",
"default": null
},
"lat_min": {
"anyOf": [
{
"type": "number",
"maximum": 90,
"minimum": -90
},
{
"type": "null"
}
],
"title": "Lat Min",
"default": null
},
"lon_max": {
"anyOf": [
{
"type": "number",
"maximum": 180,
"minimum": -180
},
{
"type": "null"
}
],
"title": "Lon Max",
"default": null
},
"lon_min": {
"anyOf": [
{
"type": "number",
"maximum": 180,
"minimum": -180
},
{
"type": "null"
}
],
"title": "Lon Min",
"default": null
},
"near_lat": {
"anyOf": [
{
"type": "number",
"maximum": 90,
"minimum": -90
},
{
"type": "null"
}
],
"title": "Near Lat",
"default": null,
"description": "search around this point, with near_lon and radius_km"
},
"near_lon": {
"anyOf": [
{
"type": "number",
"maximum": 180,
"minimum": -180
},
{
"type": "null"
}
],
"title": "Near Lon",
"default": null
},
"radius_km": {
"type": "number",
"title": "Radius Km",
"default": 300,
"maximum": 20000,
"exclusiveMinimum": 0
}
}
}| apply_qc | boolean | DEFAULT TRUE: drop the observations the store's recommended quality control rejects; false keeps every observation, flagged ones included |
| max_rows | integer | rows to return; the whole selection is at download_url |
| height_max | any |
| height_min | any |
{
"type": "object",
"title": "get_dataArguments",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"title": "Id",
"description": "a variable id from search_variables"
},
"end": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "End",
"default": null,
"description": "ISO date or datetime, EXCLUSIVE"
},
"start": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Start",
"default": null,
"description": "ISO date or datetime, inclusive (2025-01-01)"
},
"cruise": {
"anyOf": [
{
"type": "array",
"items": {
"type": "string"
}
},
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Cruise",
"default": null,
"description": "cruise expocodes, a list or a string; ocean observation tables only"
},
"lat_max": {
"anyOf": [
{
"type": "number",
"maximum": 90,
"minimum": -90
},
{
"type": "null"
}
],
"title": "Lat Max",
"default": null
},
"lat_min": {
"anyOf": [
{
"type": "number",
"maximum": 90,
"minimum": -90
},
{
"type": "null"
}
],
"title": "Lat Min",
"default": null
},
"lon_max": {
"anyOf": [
{
"type": "number",
"maximum": 180,
"minimum": -180
},
{
"type": "null"
}
],
"title": "Lon Max",
"default": null
},
"lon_min": {
"anyOf": [
{
"type": "number",
"maximum": 180,
"minimum": -180
},
{
"type": "null"
}
],
"title": "Lon Min",
"default": null
},
"station": {
"anyOf": [
{
"type": "array",
"items": {
"type": "string"
}
},
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Station",
"default": null,
"description": "station ids -- a list, or one id (or several, comma-separated) as a string; CASE-SENSITIVE: HTM150 (trigram + sampling height) for atmosphere, SE-Htm for FLUXNET sites"
},
"apply_qc": {
"type": "boolean",
"title": "Apply Qc",
"default": true,
"description": "DEFAULT TRUE: drop the observations the store's recommended quality control rejects; false keeps every observation, flagged ones included"
},
"max_rows": {
"type": "integer",
"title": "Max Rows",
"default": 100,
"maximum": 2000,
"minimum": 1,
"description": "rows to return; the whole selection is at download_url"
},
"height_max": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"title": "Height Max",
"default": null
},
"height_min": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"title": "Height Min",
"default": null
}
}
}