copernicus-mcp

copernicus-mcp

A self-hosted MCP server that gives LLM agents local, reproducible access to Copernicus environmental data including observations, reanalysis, forecasts, and climate indicators.

Category
访问服务器

README

copernicus-mcp

A self-hosted Model Context Protocol server that gives MCP-compatible LLM agents local, reproducible access to Copernicus environmental data — observations, reanalysis, forecasts, and climate indicators.

Two backends are currently supported, both using Copernicus services that are free to register for: Copernicus Marine, CDS, ADS, and EWDS.

  • Copernicus Marine (CMEMS) — 1,251 datasets across 306 products in the bundled catalogue snapshot: physics, biogeochemistry, sea ice, ocean colour, SST, sea level, waves, wind, and in-situ observations. Supports discovery, subsetting, native-file retrieval, and sync or async downloads.
  • Climate Data Store family (CDS / ADS / EWDS) — 164 datasets in the bundled snapshot across reanalysis, satellite, in-situ, atmospheric composition (CAMS), and emergency-management (EFAS / GloFAS / CEMS) data. Uses queue-based asynchronous retrieval with offline discovery from a bundled catalogue snapshot.

Ask in plain English. The server finds, filters, estimates, and downloads. Large downloads are size-estimated, gated for explicit confirmation, cached, and returned as a filepath + metadata + provenance descriptor rather than inline bytes. Every retrieval lands with an MD5-sealed sidecar JSON so the exact request is reproducible later.

"Get me Mediterranean Sea salinity forecasts for next week, then fetch the AMOC strength time series for the last 5 years."


Install

No hosted endpoint. No vendor account. No data upload. Python 3.11+ required.

With venv (stdlib, no extra tools)

python -m venv .venv
source .venv/bin/activate           # macOS / Linux
# .venv\Scripts\activate             # Windows

pip install "copernicus-mcp[cmems,cds]"     # both backends (recommended)
# pip install "copernicus-mcp[cmems]"       # CMEMS only
# pip install "copernicus-mcp[cds]"         # CDS / ADS / EWDS only

With conda / mamba / micromamba

The package is currently published on PyPI only (no conda-forge feedstock yet) — so pip install inside a fresh conda environment is the path:

mamba create -n copernicus python=3.11 pip       # or `conda create ...`
mamba activate copernicus
pip install "copernicus-mcp[cmems,cds]"

The MCP client config (next section) then points at /path/to/your/conda/envs/copernicus/bin/copernicus-mcp instead of the venv path. Run which copernicus-mcp inside the activated environment to find the exact location.

Credentials

The Copernicus services own the credentials — we never see them.

CMEMS (free account at https://data.marine.copernicus.eu/register):

copernicusmarine login            # writes ~/.copernicusmarine/.copernicusmarine-credentials

CDS / ADS / EWDS — a single Personal Access Token works across all three stores under ECMWF's unified-token policy. Get it at https://cds.climate.copernicus.eu/ → user profile:

export CDSAPI_KEY=<your-uuid-pat>
# or write to ~/.cdsapirc (same format the cdsapi CLI uses)

Some CDS-family datasets require accepting their licence once; when that happens the server returns the acceptance URL in a structured TermsNotAcceptedError.


Configure your MCP client

Claude Desktop

Add to ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or the equivalent on your platform:

{
  "mcpServers": {
    "copernicus": {
      "command": "/absolute/path/to/.venv/bin/copernicus-mcp",
      "args": ["serve"]
    }
  }
}

Restart Claude Desktop. Tools become available the next time you open a chat.

Claude Code

claude mcp add copernicus -- /absolute/path/to/.venv/bin/copernicus-mcp serve

Other MCP clients

Any client that speaks MCP over stdio works. Point it at the copernicus-mcp serve command in your virtualenv.

Smoke test

After install, confirm the server starts and your credentials resolve:

copernicus-mcp status

The output lists configured backends and where credentials were resolved from — without ever printing the credential values themselves.


Try these prompts

Drop these into a chat with the server connected. Each one walks through the discovery → estimate → download flow and lands a real file on your disk.

# Prompt What the agent does
1 "Mediterranean salinity forecast for the next 7 days." Routes to the physics-mediterranean-state group → picks MEDSEA_ANALYSISFORECAST_PHY_006_013 → downloads a daily-mean NetCDF subset.
2 "How has Arctic sea-ice extent changed over the last 5 years?" Routes to the sea-ice-arctic group → finds ARCTIC_OMI_SI_extent indicator timeseries + SEAICE_ARC_PHY_AUTO_L3_MYNRT_011_023 satellite L3.
3 "Get me the AMOC strength timeseries at 26°N." Intent-heavy query — routes to ocean-monitoring-indicators → returns GLOBAL_OMI_NATLANTIC_amoc_26N_profile and _amoc_max26N_timeseries.
4 "ERA5 hourly 2m temperature over Europe for January 2024." CDS path → describes reanalysis-era5-single-levels → submits a request, polls until the queue settles, lands a GRIB / NetCDF file.
5 "Global CO₂ atmospheric forecasts for next week." ADS path → finds cams-global-greenhouse-gas-forecasts → submits + waits + downloads.

The discovery routing is covered offline by bench/marine_routing_bench.py; the full submit-download flows are covered by tests/integration/ and require live CMEMS / CDS credentials with RUN_INTEGRATION_TESTS=1.


Tools

Backend Tool Purpose
diagnostic copernicus_mcp_status Configured backends, cache size, override hints. No credentials in output.
CMEMS marine_search_groupsmarine_search_productsmarine_search_datasets Hierarchical discovery — narrows ~1251 datasets in two hops via 47 hand-curated routing groups. Offline, no embeddings, no LLM at query time.
marine_describe_dataset Full metadata: variables, axes, spatial / temporal extent, services, DOI.
marine_get_coordinates The dataset's actual lon/lat/depth/time axes — summarised for long axes.
marine_estimate_subset Preview download size before running it.
marine_subset_dataset Download a spatio-temporal subset. Large requests require explicit confirmation. async_mode=true returns immediately.
marine_list_filesmarine_get_files For sparse / in-situ datasets (CORA, EasyCORA, INSITU-BGC, MULTIOBS): filter by bbox / time / variables, then download the precise file list.
marine_check_status, marine_cancel_subset Async lifecycle.
CDS / ADS / EWDS cds_search_groupscds_search_datasets Hierarchical group discovery + filters (bbox / time_range / variable / domain / category).
cds_describe_dataset, cds_apply_constraints Bundled snapshot + live narrowing against the store's constraints endpoint.
cds_estimate_request Heuristic byte-size + queue-tier (light / medium / heavy).
cds_submit_request, cds_check_request_status, cds_download_request_result, cds_cancel_request Async queue lifecycle. T&C-not-accepted surfaces as a structured error with the accept-URL.

Tools that return large data return {filepath, uri, metadata, provenance} — never inline bytes. The copernicus://files/{cache_key}, copernicus://jobs/{request_id}, and copernicus://provenance/{record_id} resources surface the cached artifacts to MCP clients that prefer the resource API.

For complete schemas read the inline tool descriptions your MCP client surfaces, or the detailed reference in docs/tools.md.


How it works

   ┌──────────────────────────┐       ┌─────────────────────────────┐
   │  Claude / Claude Code /  │       │   copernicus-mcp serve      │
   │  any MCP client          │ stdio │   (local Python process)    │
   └──────────────────────────┘ ────▶ │                             │
                                      │  hierarchical discovery     │
                                      │  size estimate + gate       │
                                      │  retrieval + provenance     │
                                      │  cache + idempotent re-use  │
                                      └──────────────┬──────────────┘
                                                     │
                          ┌──────────────────────────┼────────────────────────┐
                          ▼                          ▼                        ▼
                  Copernicus Marine          Climate Data Store          local cache
                  (Mercator Ocean)           CDS / ADS / EWDS            ~/Library/Caches/...
                  copernicusmarine SDK       cdsapi SDK                  (per-OS paths)

Hierarchical discovery uses bundled JSON manifests (slim records → enriched cards → product summaries → routing groups). Scoring is deterministic phrase matching. The catalogue + groups are committed JSON, so "why did this query return that group" is auditable.


Limitations

  • The server does not bypass Copernicus licences or access controls — credentials and licence acceptance remain the user's responsibility.
  • CDS-family downloads depend on upstream queue availability; large requests may take minutes to hours.
  • Catalogue snapshots are bundled at release time and may lag behind the live Copernicus catalogues. Re-publish a new version when the snapshots are refreshed.
  • Hierarchical routing is pattern-based; it does not use embeddings or an LLM at query time. Misroutes on highly ambiguous queries are possible.

Configuration

The system runs out of the box. Override via env vars (COPERNICUS_MCP_CACHE_DIR, COPERNICUS_MCP_LOG_LEVEL, COPERNICUS_MCP_ENABLED_BACKENDS=cmems,cds), a YAML file at ~/.config/copernicus-mcp/config.yaml, or --cache-dir PATH on the entry-point binary.

Cache directories are per-OS via platformdirs: Linux ~/.cache/copernicus-mcp/, macOS ~/Library/Caches/copernicus-mcp/, Windows %LOCALAPPDATA%\copernicus-mcp\Cache\.

Full reference: docs/setup.md.


Status

Latest release: see releases page (current: v0.4.2). Two backends in production: CMEMS + Climate Data Store family. CDSE, Sentinel Hub, WEkEO planned for subsequent iterations.


License

BSD 3-Clause. See LICENSE. Dependencies are EUPL-1.2 (copernicusmarine), Apache-2.0 (cdsapi and most others), MIT or BSD.


Acknowledgements


Related projects

  • AQUAVIEW MCP — hosted MCP server unifying ~700K datasets across 68 NOAA / IOOS / EMODnet / Argo / GOES-R / Sentinel collections. If your question reaches beyond Copernicus into US / global multi-agency oceanographic and atmospheric data, that's the natural complement to this server.

推荐服务器

Baidu Map

Baidu Map

百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。

官方
精选
JavaScript
Playwright MCP Server

Playwright MCP Server

一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。

官方
精选
TypeScript
Magic Component Platform (MCP)

Magic Component Platform (MCP)

一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。

官方
精选
本地
TypeScript
Audiense Insights MCP Server

Audiense Insights MCP Server

通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。

官方
精选
本地
TypeScript
VeyraX

VeyraX

一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。

官方
精选
本地
graphlit-mcp-server

graphlit-mcp-server

模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。

官方
精选
TypeScript
Kagi MCP Server

Kagi MCP Server

一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。

官方
精选
Python
e2b-mcp-server

e2b-mcp-server

使用 MCP 通过 e2b 运行代码。

官方
精选
Neon MCP Server

Neon MCP Server

用于与 Neon 管理 API 和数据库交互的 MCP 服务器

官方
精选
Exa MCP Server

Exa MCP Server

模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。

官方
精选