ICOS carbon and greenhouse-gas observations

eu.icos-cp由 icos-cp.eu 发布官方发布者v0.3.0更新于 Nov 7, 2026

ICOS atmosphere, ocean and ecosystem greenhouse-gas observations, with citation and DOI per answer

已验证Streamable HTTP可网页运行网页搜索与抓取知识与记忆数据与分析

概览

AI 生成的概览

查询 ICOS 温室气体与生态系统观测数据:检索变量与站点、估算并获取数据、计算统计量,并返回带 DOI 的引用信息。

可以做什么
  • 列出数据集,并按名称、物理量、单位或 ECV 检索变量,再完整描述单个变量(单位、覆盖范围、质量标记读法)
  • 按坐标点、范围框、名称或国家查找携带某变量的站点
  • 在获取数据前估算所选范围的数据量
  • 按范围框、时间、站点、航次、高度和质量控制筛选获取单个变量的观测值,并提供完整选择的下载链接
  • 对整个选择计算计数、均值、最小值、最大值、总和与标准差,可按站点、年、月或日分组
  • 获取引用文本、许可与 DOI,以及某选择所依据的全部源数据对象
适用场景
当你需要权威的大气、海洋或生态系统温室气体观测数据,并希望助手找到正确的变量与站点、评估请求规模,然后返回统计结果或下载链接而非原始行时使用。适合涉及 CO2、CH4、N2O、通量或站点对比且必须规范引用的问题。
运行要求
远程 streamable HTTP 端点,无需安装包或本地运行时。公开端点未声明需要身份验证或 API 密钥。需要能访问 ICOS 服务的网络。
安装前请注意
仅提供只读数据访问,但每个数据回答都附带引用、许可与 DOI,必须转达给用户。站点 ID 区分大小写,已发布数据集滞后于当前日期,近期时段需使用近实时数据集。海洋数据集(ICOS ocean 与全球 SOCAT)容易混淆,须按实际使用的那个引用。

安装

在 SourceWeft 中

  1. 打开 控制台中的 ICOS carbon and greenhouse-gas observations,将其添加到工作区。
  2. 为需要使用其工具的对话启用该服务。

Web executable,通过 Streamable HTTP。 远程服务在工作区中配置后即可从网页运行时运行。

交给智能体安装

把这段提示词粘贴到 Claude Code、Codex、Cursor 等智能体,或 SourceWeft 对话中。智能体会读取该服务器的安装指南,先向你展示发布者、端点和登录方式,经你同意后再把它添加到你的客户端。密钥不会写进任何命令。

阅读 https://sourceweft.com/mcp/eu.icos-cp%2Ficos/install.md,并按其中说明把这个 MCP 服务器接入我的客户端。修改任何配置之前,先告诉我它的发布者、端点和登录方式,等我确认。不要把 API 密钥写进命令或我会提交的文件;问我密钥应从哪里获取。

查看智能体所依据的安装指南

其他 MCP 客户端

把它添加到你客户端的 mcpServers 配置中。

{
  "mcpServers": {
    "icos-carbon-and-greenhouse-gas-observati": {
      "type": "http",
      "url": "https://mcp.icos-cp.eu/mcp"
    }
  }
}

README

icos-mcp

ICOS carbon and greenhouse-gas observations for AI assistants, over the Model Context Protocol. A thin server over the ICOS zarr proxy (https://zarr.icos-cp.eu): every number comes from the proxy, and every data answer carries the citation, licence and DOI. The plan, and why it is built this way, is docs/plan.md.

Phases 1 and 2: seven read-only tools, five resources, three prompts, and a per-store access policy.

tooldoes
list_datasetsthe stores, with domain, coverage, licence, DOI
search_variablesvariable ids by name, quantity or unit ("methane" finds ch4)
describe_variableone variable in full, with how its QC flag is read
find_stationsthe stations carrying a variable: near a point, in a box, by name or country
estimatehow big a selection is, before fetching it
get_dataat most 2,000 rows, the total, a CSV download URL for the whole selection, the citation
get_citationcitation, licence and DOI from the data passport

Run it

uv run icos-mcp                                   # stdio, for a local clientuv run icos-mcp --transport streamable-http --port 8090   # http://127.0.0.1:8090/mcp

ICOS_PROXY points it at another proxy (the RC, a test instance).

Over HTTP the server also answers GET / with an HTML page in the style of zarr.icos-cp.eu -- built from what it offers an anonymous caller: the endpoint and how to connect, the public datasets, the tools and prompts, the citation rule (landing.py; ICOS_MCP_PUBLIC_URL sets the endpoint it names, default https://mcp.icos-cp.eu) -- and GET /health.

Which stores it offers

DEFAULT-DENY: a store is offered only when a rule names it, whatever the proxy behind the server would serve. Without a config file the rules are exactly the public stores of zarr.icos-cp.eu (config/public.json writes them out). ICOS_MCP_CONFIG=/path/to/config.json sets the proxy, the Host header to send it, the base of download links, and an ordered list of store rules, each public or token:

uv run icos-mcp --show-policy          # what this config offers, to whomuv run icos-mcp --hash-token TOKEN     # the line a tokens_file takes

config/ct122.example.json is the shape for running beside zpd on CT122, where zpd answers for EVERY store on the machine (the shuttle, GlobalView, AGAGE): the public stores by name, those three behind tokens, anything else hidden. A token store is offered to an HTTP caller sending Authorization: Bearer <token> whose SHA-256 is in its tokens_file (plain tokens are never stored); a local stdio caller is the operator and uses ICOS_MCP_TOKEN, which never speaks for an HTTP caller. A hidden store answers exactly as one that does not exist, and the static icos://catalogue resource -- which the protocol does not tell who is asking -- lists the public stores only.

Signing in

An oauth section in the config makes signing in required over HTTP. Anyone can sign in. The aim is to know who uses the server, not to keep anyone out:

"oauth": {"issuer": "https://sso.fs4vm.icos-cp.eu/realms/icos-test",          "audience": "https://mcp.icos-cp.eu"}

The server is only a resource server. ICOS's Keycloak handles the sign-in, through cpauth, Google or ORCID. MCP clients find Keycloak in /.well-known/oauth-protected-resource, register themselves with it and send the user to sign in. A token must be signed by the realm and carry this server's audience, which needs an audience mapper in Keycloak. The store tokens above still work. The landing page and /health stay open, and the stdio operator is never asked to sign in (auth.py).

Signing in also allows a group store rule. The store is offered to members of a Keycloak group, or of a subgroup of one, and to no one else. The groups come from the verified token's groups claim:

{"match": "agage*", "access": "group", "groups": ["agage"], "public_url": "https://agage-zarr.icos-cp.eu"}

Group names are paths below /apps/mcp in the realm: agage is /apps/mcp/agage. That is the only part of a user's groups Keycloak sends this server.

Access is granted and withdrawn in Keycloak, not in the config. A group rule may also list store tokens for scripts. A group rule without an oauth section is refused at load, because nobody could reach it.

In Claude Code:

claude mcp add icos -- uv --directory /path/to/zarrm9/mcp run icos-mcp

Resources: icos://stores/{store}/agent-guide, icos://stores/{store}/croissant, icos://catalogue, icos://llms.txt, icos://data-passport. Prompts: station_record, compare_stations, ocean_region.

Test it

uv run pytest                                 # over RECORDED proxy answers (tests/cassette)ICOS_CASSETTE_MODE=record uv run pytest       # re-record from the live proxyICOS_LIVE=1 uv run pytest                     # live, nothing recordeduv run ruff check src testsconformance/run.sh                            # the MCP conformance suite (needs Node)

conformance/run.sh starts a local server and runs the MCP project's own conformance suite against it, pinned to 0.1.16 by conformance/package-lock.json. conformance/baseline.yml lists the known failures and why each one fails (mostly the suite's own test fixtures, which a real server doesn't carry). It is read in both directions: a new failure fails the run, and so does an entry that now passes.

eval/questions.json is the DRAFT evaluation set: 30 questions across the three domains, each naming the variable and station a correct answer must use and a truth computed from the proxy at run time. It needs one reviewer per domain before it is relied on; the runner is not written yet.

This server is the ORACLE for the M9 port (mcpd, plan phase 7): its tool names, descriptions and answer shapes are the contract the port is replayed against, so change them deliberately.

Licence

Copyright (C) 2026 ICOS ERIC -- Carbon Portal.

This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. See LICENSE.

The DATA this server serves are not covered by this licence: each answer carries the licence of its dataset (ICOS data are CC BY 4.0) and the citation to give with it.

来源:README.md,提交 4da9c57

工具

8

list_datasets

List the ICOS datasets: one per data store, with domain (atmosphere, ocean, ecosystem), time and space coverage, licence and DOI.

无需输入参数。

search_variables

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).

输入参数text必填limitstoredomain

describe_variable

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.

输入参数id必填

estimate

How big a selection is -- rows, stations, time span -- without fetching it. Call this before get_data.

输入参数id必填endstartcruiselat_maxlat_minlon_maxlon_minstationapply_qcheight_maxheight_min

get_data

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.

输入参数id必填endstartcruiselat_maxlat_minlon_maxlon_minstationapply_qcmax_rowsquestion另有 2 个

get_citation

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.

输入参数id必填endstartlat_maxlat_minlon_maxlon_minstation

aggregate

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.

输入参数byid必填endstartcruiselat_maxlat_minlon_maxlon_minstationapply_qcquestion另有 2 个

find_stations

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=.

输入参数id必填textlimitcountrylat_maxlat_minlon_maxlon_minnear_latnear_lonradius_km

版本历史

2
  1. v0.3.0最新Nov 7, 2026
  2. v0.2.0Oct 30, 2026

评分

已满足适用检查项的 100%

该评分衡量此收录条目的完整程度,依据注册中心条目、端点与公开来源计算得出。它不是对服务器本身的评价,也不表示服务器安全或当前可用:可连通性是带日期的检查结果,评分也不包含安装量或用户评价。

  • 近 30 天内可连通必需25 分
  • 已声明认证方式必需10 分
  • 已列出工具必需15 分
  • 描述必需15 分
  • 图标10 分
  • 文档15 分
  • 许可证10 分