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 分