Skip to main content
Glama

aicesat — cross-mission altimetry

An MCP server for Claude Desktop that pulls real ICESat-2 ATL03 photons and ICESat/GLAS GLAH06 shots over a chosen area, renders them as a 3D point cloud (deck.gl), and — on a toggle — applies an ITRF2014 + epoch co-registration (plate motion, ITRF2014-PMM / NOAM) with pyproj, updating the co-located Δh statistics. Started from docs/cross-mission-altimetry-mcp-spec.md, which carries the full design and rationale.

The co-registration removes plate motion between epochs. It does not remove ice flow, GIA, geoid/tide, firn compaction, or the vertical datum, and the widget says so on every answer. GLAS heights are converted TOPEX/Poseidon → WGS84 ellipsoid using the product's d_deltaEllip, with the saturation correction d_satElevCorr applied; that is recorded in every comparability block.

Setup

uv sync          # Python 3.13
uv run pytest    # offline unit tests

Earthdata Login: a bearer token is read from ~/.edl/token.prod (override with AICESAT_EDL_FILE, or set EARTHDATA_TOKEN). The server never writes to stdout (stdio MCP transport); logs go to stderr.

Related MCP server: pointcloud-mcp

Claude Desktop

Add to ~/Library/Application Support/Claude/claude_desktop_config.json, using the absolute path to your checkout:

{
  "mcpServers": {
    "aicesat": {
      "command": "/opt/homebrew/bin/uv",
      "args": ["--directory", "/ABSOLUTE/PATH/TO/aicesat", "run", "aicesat-server"]
    }
  }
}

Restart Claude Desktop. The unified UI renders inline as an MCP App; the server also serves it at http://127.0.0.1:8765/ (port via AICESAT_PORT) for use in a browser.

Tools: open_ui, list_regions, list_scenes, check_coverage, show_photons (region, bbox, or polygon), add_glas, coregister, lake_status, lake_load_cells, job_status.

UI

One self-contained page (built from src/aicesat/ui/* + vendored deck.gl / h3-js by scripts/build_ui.py, pure Python; the server rebuilds it on start when sources change), served both inline in Claude Desktop and at /:

  • Explore — a 3-D globe (Natural Earth basemap, no flat projection). Navigate anywhere, draw a box or polygon, check coverage, and build a scene as a background job; scene footprints and the loaded H3 cells are shown on the globe.

  • Lake — the persistent Parquet lake as an H3 grid: per-cell stats on hover, a storage limit that auto-evicts the least-recently-used cells, and background loading or eviction of selected cells.

  • Scene — the 3-D viewer: ICESat-2 and GLAS points draped on a DEM, an Adjustments panel of correction toggles, and the co-located Δh histograms. The true plate-motion shift is sub-pixel at scene scale, so the clouds do not visibly move — the effect is read from the Δh panel, not an exaggerated visual. Panels collapse and close.

The UI talks to a transport-neutral API (api.py) exposed two ways: the localhost /api/* routes for the browser, and visibility:["app"] MCP tools the host proxies for the inline app. scripts/e2e_apps.py checks the MCP-App wiring.

Architecture

The ATL03 path does not open HDF5 at query time. Per granule, an index build (index.py) records each chunk's byte range, filter pipeline, and the H3 cells it touches. Queries resolve a bbox/polygon to cells, fetch only the needed chunks by HTTPS range request (EDL bearer token → presigned URL), decode them without an HDF5 library, and materialize photons into a hive-partitioned Parquet lake (lake.py) with per-row provenance and co-registered coordinates. DuckDB answers over the lake (api.py); a coverage table records what is materialized so repeat queries fetch nothing. The earlier earthaccess.open + h5py path is kept as atl03.extract_legacy for comparison. scripts/bench_access.py compares the access methods; see the spec (Appendix C) for the approach.

Scene geometry is latitude-aware (scene.frame_crs): polar-stereographic near the poles, a per-scene azimuthal-equidistant projection elsewhere, so scenes render anywhere on Earth.

DEM and imagery

The scene surface is a real DEM chosen by region, always on WGS84-ellipsoid heights (the same vertical reference as ATL03), read by window over /vsicurl/ and cached: ArcticDEM v4.1 (Arctic, EPSG:3413) and REMA v2.0 (Antarctic, EPSG:3031) — both already ellipsoidal — and Copernicus GLO-30 elsewhere, whose EGM2008 orthometric heights are converted to ellipsoidal by adding the NGA egm08 geoid undulation (h = H + N). There is no photon-interpolated fallback: a scene shows a DEM only where one covers it. Scene imagery is Sentinel-2 cloudless (EOX, CC BY-NC-SA 4.0), draped on the surface. The Explore/Lake globe basemap is Natural Earth 50 m land (public domain). Attributions appear on screen.

Scripts

uv run scripts/check_coverage.py --region egig_west_flank   # granule counts by month / laser campaign
uv run scripts/ingest.py egig_west_flank                    # index + byte-range ingest + lake query
uv run scripts/build_index.py --region egig_west_flank      # offline index pre-build (amortized off the query path)
uv run scripts/make_scene.py egig_west_flank --glas --coreg # full pipeline for a region
uv run scripts/serve.py                                     # widget server only, for local testing
uv run scripts/bench_access.py                              # access-method comparison

Data (data/) is gitignored; delete it to force a re-fetch.

How Δh is measured

For each GLAS shot, the ICESat-2 surface height at the footprint centre comes from a local along-track linear fit of the signal photons within the co-location radius. A disc median is an order statistic and cannot resolve the sub-cm slope effect; the fit is continuous in position, so it can. Only the along-beam component of the plate-motion shift is observable on a single beam, and the per-pair artifact panel keeps the mm-level vertical part of the frame step separate from the slope effect. Every answer carries the unresolved list and states "plate motion applied", never "the missions agree".

Install Server
F
license - not found
C
quality
B
maintenance

Maintenance

Maintainers
<1hResponse time
Release cycle
Releases (12mo)
Commit activity

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Servers

View all related MCP servers

Related MCP Connectors

  • OpenTopography global DEM rasters + point queries (free key)

  • Open Topo Data — global elevation lookups (multiple DEM datasets)

  • Measured ground motion per US address (NASA InSAR). Self-register, $0.40/report, misses free.

View all MCP Connectors

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/eigenbeam/aicesat'

If you have feedback or need assistance with the MCP directory API, please join our Discord server