Chuk Mcp Stac — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited Chuk Mcp Stac (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Satellite Imagery Discovery & Retrieval MCP Server - A comprehensive Model Context Protocol (MCP) server for searching STAC catalogs, downloading satellite bands, and creating composites.
This is a demonstration project provided as-is for learning and testing purposes.
This MCP server provides access to satellite imagery through STAC (SpatioTemporal Asset Catalog) APIs via twenty-one tools.
All tools return fully-typed Pydantic v2 models for type safety, validation, and excellent IDE support. All tools support output_mode="text" for human-readable output alongside the default JSON.
stac_list_catalogs)List available STAC catalogs:
stac_list_collections)Browse collections in a catalog:
stac_search)Search for satellite scenes:
stac_describe_scene)Get detailed metadata for a scene:
stac_preview)Get a preview/thumbnail URL for a scene:
rendered_preview or thumbnail asset URLstac_download_bands)Download specific bands from a scene:
stac_download_rgb)Download true-color RGB composites:
stac_download_composite)Create multi-band composites:
stac_compute_index)Compute spectral indices for a scene:
stac_mosaic)Merge multiple scenes into a single raster:
stac_time_series)Extract temporal band data:
stac_status)Check server configuration:
stac_capabilities)List full server capabilities for LLM workflow planning:
stac_estimate_size)Estimate download size before committing to a full download:
stac_describe_collection)Get detailed collection metadata with LLM-friendly guidance:
stac_get_conformance)Check which STAC API features a catalog supports:
stac_find_pairs)Find before/after scene pairs for change detection:
stac_coverage_check)Verify cached scenes fully cover a target area:
stac_queryables)Fetch queryable properties from a STAC API:
stac_temporal_composite)Combine multiple scenes via per-pixel statistics:
stac_zonal_stats)Read a raster's values within zones — the inference step after a fetch:
n_valid / mean / std / min / max / median / p10 / p90buffer_m (circular) or GeoJSON polygons, in any CRSbackground_m annulus → a local z-score (anomaly readout) for cropmark / feature detectionuvx chuk-mcp-stac# Install from PyPI
uv pip install chuk-mcp-stac
# Or clone and install from source
git clone <repository-url>
cd chuk-mcp-stac
uv sync --devpip install chuk-mcp-stac#### Option 1: Run Locally with uvx
MacOS: ~/Library/Application Support/Claude/claude_desktop_config.json Windows: %APPDATA%/Claude/claude_desktop_config.json
{
"mcpServers": {
"stac": {
"command": "uvx",
"args": ["chuk-mcp-stac"]
}
}
}#### Option 2: Run Locally with pip
{
"mcpServers": {
"stac": {
"command": "chuk-mcp-stac"
}
}
}Run the server directly:
# With uvx (recommended - always latest version)
uvx chuk-mcp-stac
# With uvx in HTTP mode
uvx chuk-mcp-stac http
# Or if installed locally
chuk-mcp-stac
chuk-mcp-stac httpOr with uv/Python:
# STDIO mode (default, for MCP clients)
uv run chuk-mcp-stac
# or: python -m chuk_mcp_stac.server
# HTTP mode (for web access)
uv run chuk-mcp-stac http
# or: python -m chuk_mcp_stac.server httpSTDIO mode is for MCP clients like Claude Desktop and mcp-cli. HTTP mode runs a web server on http://localhost:8002 for HTTP-based MCP clients.
Once configured, you can ask Claude questions like:
The examples/ directory contains 19 runnable demos covering all 21 tools. Each script is self-contained and produces a PNG output in examples/output/.
#### Core Tool Demos
| Script | Network? | Tools Demonstrated |
|---|---|---|
capabilities_demo.py | No | stac_capabilities, stac_status, stac_list_catalogs |
collection_intel_demo.py | Yes | stac_describe_collection, stac_get_conformance, stac_estimate_size |
colchester_from_space.py | Yes | stac_search → stac_download_rgb → stac_compute_index |
mosaic_demo.py | Yes | stac_search → stac_describe_scene → stac_mosaic |
time_series_demo.py | Yes | stac_time_series → stac_download_bands |
landsat_demo.py | Yes | stac_search → stac_download_bands (Landsat band aliases) |
change_detection_demo.py | Yes | stac_find_pairs → stac_preview → stac_coverage_check |
false_color_demo.py | Yes | stac_describe_collection → stac_download_composite |
temporal_composite_demo.py | Yes | stac_list_collections → stac_queryables → stac_temporal_composite |
#### Real-World Showcase Demos
| Script | Location | What It Shows |
|---|---|---|
wildfire_scar_demo.py | California, USA | Park Fire burn scar — before/after RGB, NDVI, false-colour SWIR composite |
uk_flooding_demo.py | Lincolnshire, UK | Storm Babet flooding — NDWI water index before/after with cloud masking |
coastal_erosion_demo.py | Yorkshire, UK | Holderness coast retreat — 2019 vs 2024 NDWI coastline comparison |
crop_health_demo.py | Cambridgeshire, UK | Wheat phenology — cloud-masked NDVI across growing season |
dubai_growth_demo.py | Dubai, UAE | Urban expansion — 2022 vs 2024 NDBI built-up index |
vegas_f1_demo.py | Las Vegas, USA | F1 race infrastructure — summer vs race week NDBI comparison |
amazon_deforestation_demo.py | Rondônia, Brazil | Dry season NDVI time series tracking deforestation |
lake_chad_demo.py | Chad/Nigeria | Seasonal water extent — NDWI wet vs dry season |
singapore_port_demo.py | Singapore | Port activity — RGB time series across 6 months |
alps_snow_demo.py | Mont Blanc, Alps | Snow cover — custom NDSI winter vs summer |
cd examples
python capabilities_demo.py # no network required
python colchester_from_space.py # full search → download → render pipeline
python wildfire_scar_demo.py # before/after burn scar comparisonAll tools accept an optional output_mode parameter ("json" default, or "text" for human-readable output). Download tools that produce GeoTIFF output automatically generate a PNG preview (preview_ref in the response).
{
"bbox": [0.85, 51.85, 0.95, 51.92], # [west, south, east, north]
"collection": "sentinel-2-c1-l2a", # optional
"date_range": "2024-06-01/2024-08-31", # optional
"max_cloud_cover": 20, # 0-100, optional
"max_items": 10, # optional
"catalog": "earth_search" # optional
}{
"scene_id": "S2B_...", # from search results
"bands": ["red", "green", "blue", "nir"], # common names or aliases (B04, SR_B4)
"bbox": [0.85, 51.85, 0.95, 51.92], # optional crop
"output_format": "geotiff", # "geotiff" or "png"
"cloud_mask": false # Sentinel-2 only
}{
"scene_id": "S2B_...",
"bbox": [0.85, 51.85, 0.95, 51.92], # optional crop
"output_format": "png", # "geotiff" or "png"
"cloud_mask": false # Sentinel-2 only
}{
"scene_id": "S2B_...",
"bands": ["nir", "red", "green"], # false-color infrared
"composite_name": "false_color_ir", # optional label
"bbox": [0.85, 51.85, 0.95, 51.92], # optional crop
"output_format": "geotiff", # "geotiff" or "png"
"cloud_mask": false # Sentinel-2 only
}{
"scene_id": "S2B_...",
"index_name": "ndvi", # ndvi, ndwi, ndbi, evi, savi, bsi
"bbox": [0.85, 51.85, 0.95, 51.92], # optional crop
"cloud_mask": true, # mask clouds with NaN
"output_format": "geotiff" # "geotiff" or "png"
}{
"scene_ids": ["S2B_001", "S2B_002"],
"bands": ["red", "green", "blue"],
"bbox": [0.85, 51.85, 0.95, 51.92], # optional
"method": "last", # "last" or "quality" (SCL-based)
"output_format": "geotiff", # "geotiff" or "png"
"cloud_mask": false # per-scene masking before merge
}{
"bbox": [0.85, 51.85, 0.95, 51.92],
"bands": ["red", "nir"],
"date_range": "2024-01-01/2024-12-31",
"collection": "sentinel-2-c1-l2a", # optional
"max_cloud_cover": 10, # optional
"max_items": 50, # optional
"catalog": "earth_search" # optional
}{
"scene_id": "S2B_...",
"bands": ["red", "green", "blue", "nir"],
"bbox": [0.85, 51.85, 0.95, 51.92] # optional crop
}{
"collection_id": "sentinel-2-l2a",
"catalog": "earth_search", # optional
"output_mode": "text" # optional: "json" or "text"
}{
"catalog": "earth_search", # optional
"output_mode": "json" # optional: "json" or "text"
}# Clone the repository
git clone <repository-url>
cd chuk-mcp-stac
# Install with uv (recommended)
uv sync --dev
# Or with pip
pip install -e ".[dev]"make test # Run tests
make test-cov # Run tests with coverage
make coverage-report # Show coverage reportmake lint # Run linters
make format # Auto-format code
make typecheck # Run type checking
make security # Run security checks
make check # Run all checksmake build # Build package
make docker-build # Build Docker imageDeploy to Fly.io with a single command:
# First time setup
fly launch
# Deploy updates
fly deploy# Build the image
docker build -t chuk-mcp-stac .
# Run the container
docker run -p 8002:8002 chuk-mcp-stacBuilt on top of chuk-mcp-server, this server uses:
asyncio.to_thread()extra="forbid" for all responsespreview_ref)output_mode="text" for human-readable responsesSee ARCHITECTURE.md for design principles and data flow diagrams. See SPEC.md for the full tool specification with parameter tables. See ROADMAP.md for development status and planned features.
| Catalog | Collections | URL |
|---|---|---|
| Earth Search (AWS) | Sentinel-2, Landsat, NAIP, MODIS | earth-search.aws.element84.com |
| Planetary Computer (Microsoft) | Sentinel-2, Landsat, MODIS | planetarycomputer.microsoft.com |
| USGS Landsat Look | Landsat | landsatlook.usgs.gov |
Also supports Sentinel-1 SAR (VV/VH) and Copernicus DEM GLO-30 collections.
Contributions are welcome! Please feel free to submit a Pull Request.
git checkout -b feature/amazing-feature)git commit -m 'Add amazing feature')git push origin feature/amazing-feature)Apache License 2.0 - See LICENSE for details.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.