Chuk MCP STAC
OfficialProvides access to satellite imagery through the Earth Search STAC catalog hosted on Amazon Web Services (AWS), enabling search, download, and processing of satellite bands from various missions such as Sentinel-2 and Landsat.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Chuk MCP STACsearch for Sentinel-2 scenes near Paris with <10% cloud cover"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Chuk MCP STAC
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.
Features
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.
1. Catalog Discovery (stac_list_catalogs)
List available STAC catalogs:
Earth Search (AWS) and Planetary Computer (Microsoft)
Shows default catalog and available endpoints
2. Collection Browsing (stac_list_collections)
Browse collections in a catalog:
List all available satellite collections
Spatial and temporal extents
Collection descriptions and metadata
3. Scene Search (stac_search)
Search for satellite scenes:
Bounding box spatial queries
Date range filtering
Cloud cover thresholds
Collection filtering (Sentinel-2, Landsat, etc.)
Configurable result limits
4. Scene Details (stac_describe_scene)
Get detailed metadata for a scene:
Available bands and assets
CRS and projection info
Cloud cover, datetime, spatial extent
Filters out metadata-only assets
5. Scene Preview (stac_preview)
Get a preview/thumbnail URL for a scene:
Returns
rendered_previeworthumbnailasset URLPrefers rendered previews over thumbnails
Fast visual browsing without downloading full bands
6. Band Download (stac_download_bands)
Download specific bands from a scene:
Any combination of bands (red, green, blue, nir, etc.)
Hardware band aliases supported (B04, B08, SR_B4, etc.)
Optional bbox cropping in EPSG:4326
Output as GeoTIFF or PNG (auto-stretched)
SCL-based cloud masking (Sentinel-2 only)
7. RGB Composite (stac_download_rgb)
Download true-color RGB composites:
Convenience wrapper for red, green, blue bands
Automatic band resolution matching
PNG output for inline LLM rendering
8. Custom Composite (stac_download_composite)
Create multi-band composites:
Any band combination (e.g., false-color infrared: nir, red, green)
Named composites for easy identification
Cloud masking and PNG output support
9. Spectral Index (stac_compute_index)
Compute spectral indices for a scene:
NDVI, NDWI, NDBI, EVI, SAVI, BSI
Automatically selects required bands
Cloud masking (masked pixels → NaN)
Output as float32 GeoTIFF or stretched PNG
10. Mosaic (stac_mosaic)
Merge multiple scenes into a single raster:
Combines overlapping scenes
Standard merge (last) or quality-weighted (best pixel via SCL)
Per-scene cloud masking before merge
11. Time Series (stac_time_series)
Extract temporal band data:
Searches scenes across a date range
Downloads bands for each date
Concurrent downloads for performance
Cloud cover filtering
12. Server Status (stac_status)
Check server configuration:
Server version and storage provider
Default catalog
Artifact store availability
13. Capabilities (stac_capabilities)
List full server capabilities for LLM workflow planning:
Available catalogs and collections
Spectral indices with required bands
Band mappings by satellite platform
Tool count
14. Size Estimation (stac_estimate_size)
Estimate download size before committing to a full download:
Reads only COG headers (no pixel data transferred)
Per-band dimensions, dtype, and byte estimates
Warnings for large downloads (>=500MB, >=1GB)
15. Collection Intelligence (stac_describe_collection)
Get detailed collection metadata with LLM-friendly guidance:
Band wavelengths and resolutions
Recommended composite recipes
Supported spectral indices
Cloud masking info and usage guidance
16. Conformance Checking (stac_get_conformance)
Check which STAC API features a catalog supports:
Parses conformance URIs into feature flags
Core, item_search, filter, sort, fields, query, collections
17. Find Scene Pairs (stac_find_pairs)
Find before/after scene pairs for change detection:
Separate before and after date ranges
Computes spatial overlap percentage per pair
Caches all found scenes for follow-up download
18. Coverage Check (stac_coverage_check)
Verify cached scenes fully cover a target area:
Rasterizes bounding box into a 100x100 grid
Returns coverage percentage and uncovered areas
Ensures full spatial coverage before download
19. Queryable Properties (stac_queryables)
Fetch queryable properties from a STAC API:
Catalog-level or collection-scoped queryables
Property names, types, descriptions, and enum values
Enables advanced CQL2 filter construction
20. Temporal Composite (stac_temporal_composite)
Combine multiple scenes via per-pixel statistics:
Methods: median, mean, max, min
Reduces cloud contamination in time series
SCL-based cloud masking per scene before compositing
21. Zonal Statistics (stac_zonal_stats)
Read a raster's values within zones — the inference step after a fetch:
Per-zone
n_valid / mean / std / min / max / median / p10 / p90Zones as points +
buffer_m(circular) or GeoJSON polygons, in any CRSOptional
background_mannulus → a local z-score (anomaly readout) for cropmark / feature detection
Related MCP server: Jupyter Earth MCP Server
Installation
Using uvx (Recommended - No Installation Required!)
uvx chuk-mcp-stacUsing uv (Recommended for Development)
# 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 --devUsing pip (Traditional)
pip install chuk-mcp-stacUsage
With Claude Desktop
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"
}
}
}Standalone
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.
Example Usage
Once configured, you can ask Claude questions like:
"Search for Sentinel-2 imagery over London from last month"
"Download an RGB composite of that scene"
"Show me a false-color infrared view using NIR, red, and green bands"
"Compute the NDVI for this scene with cloud masking"
"Create a mosaic of these overlapping scenes"
"Get a time series of NDVI data for this farm over the growing season"
"What collections are available on Earth Search?"
"Describe the Sentinel-2 collection — what bands and composites are available?"
"How big would downloading 4 bands from that scene be?"
"What STAC API features does Earth Search support?"
Demo Scripts
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 |
| No |
|
| Yes |
|
| Yes |
|
| Yes |
|
| Yes |
|
| Yes |
|
| Yes |
|
| Yes |
|
| Yes |
|
Real-World Showcase Demos
Script | Location | What It Shows |
| California, USA | Park Fire burn scar — before/after RGB, NDVI, false-colour SWIR composite |
| Lincolnshire, UK | Storm Babet flooding — NDWI water index before/after with cloud masking |
| Yorkshire, UK | Holderness coast retreat — 2019 vs 2024 NDWI coastline comparison |
| Cambridgeshire, UK | Wheat phenology — cloud-masked NDVI across growing season |
| Dubai, UAE | Urban expansion — 2022 vs 2024 NDBI built-up index |
| Las Vegas, USA | F1 race infrastructure — summer vs race week NDBI comparison |
| Rondônia, Brazil | Dry season NDVI time series tracking deforestation |
| Chad/Nigeria | Seasonal water extent — NDWI wet vs dry season |
| Singapore | Port activity — RGB time series across 6 months |
| 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 comparisonTool Reference
All 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).
stac_search
{
"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
}stac_download_bands
{
"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
}stac_download_rgb
{
"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
}stac_download_composite
{
"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
}stac_compute_index
{
"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"
}stac_mosaic
{
"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
}stac_time_series
{
"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
}stac_estimate_size
{
"scene_id": "S2B_...",
"bands": ["red", "green", "blue", "nir"],
"bbox": [0.85, 51.85, 0.95, 51.92] # optional crop
}stac_describe_collection
{
"collection_id": "sentinel-2-l2a",
"catalog": "earth_search", # optional
"output_mode": "text" # optional: "json" or "text"
}stac_get_conformance
{
"catalog": "earth_search", # optional
"output_mode": "json" # optional: "json" or "text"
}Development
Setup
# 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]"Running Tests
make test # Run tests
make test-cov # Run tests with coverage
make coverage-report # Show coverage reportCode Quality
make lint # Run linters
make format # Auto-format code
make typecheck # Run type checking
make security # Run security checks
make check # Run all checksBuilding
make build # Build package
make docker-build # Build Docker imageDeployment
Fly.io
Deploy to Fly.io with a single command:
# First time setup
fly launch
# Deploy updates
fly deployDocker
# Build the image
docker build -t chuk-mcp-stac .
# Run the container
docker run -p 8002:8002 chuk-mcp-stacArchitecture
Built on top of chuk-mcp-server, this server uses:
Async-First: Native async/await with sync rasterio wrapped in
asyncio.to_thread()Type-Safe: Pydantic v2 models with
extra="forbid"for all responsesEfficient I/O: Cloud-Optimized GeoTIFF (COG) reading with windowed access
Smart Caching: LRU scene cache (200 entries), TTL client cache (300s), in-memory raster cache (100 MB LRU)
Band Resolution Matching: Automatic bilinear resampling when bands differ in resolution
Band Aliases: Hardware names (B04, SR_B4) resolved to common names at entry
Artifact Storage: Pluggable storage via chuk-artifacts (memory, filesystem, S3)
CRS Handling: Automatic EPSG:4326 to native CRS reprojection for bbox queries
Cloud Masking: SCL-based masking for Sentinel-2 (integer → 0, float → NaN)
Spectral Indices: NDVI, NDWI, NDBI, EVI, SAVI, BSI with automatic band selection
PNG Output: 2nd-98th percentile stretch for visual inspection and LLM rendering
Auto-Preview: PNG preview auto-generated alongside every GeoTIFF download (
preview_ref)Temporal Compositing: Pixel-by-pixel statistical composites (median, mean, max, min)
Quality Mosaics: SCL-based best-pixel selection for quality-weighted merges
Progress Callbacks: Optional progress reporting for long-running operations
PC Auth: Automatic Planetary Computer asset signing when package is installed
Dual Output: All 21 tools support
output_mode="text"for human-readable responses
See 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.
Supported Catalogs
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.
Contributing
Contributions are welcome! Please feel free to submit a Pull Request.
Fork the repository
Create your feature branch (
git checkout -b feature/amazing-feature)Commit your changes (
git commit -m 'Add amazing feature')Push to the branch (
git push origin feature/amazing-feature)Open a Pull Request
License
Apache License 2.0 - See LICENSE for details.
Acknowledgments
STAC Spec for the SpatioTemporal Asset Catalog specification
pystac-client for the STAC client library
rasterio for raster data I/O
Model Context Protocol for the MCP specification
Anthropic for Claude and MCP support
Available Tools
24 toolsstac_capabilitiesA
List server capabilities: catalogs, collections, and band info.
Returns a comprehensive overview of what this server can do, including supported catalogs, satellite collections, band names per platform, and available spectral indices with required bands.
Args: output_mode: Response format - "json" (default) or "text"
Returns: JSON with catalogs, collections, band mappings, and spectral indices
Tips for LLMs: - Call this FIRST to understand what the server can do before planning any analysis workflow - Use band_mappings to know which band names to pass to download tools - Use spectral_indices to see which indices are available and what bands they require - Typical workflow: stac_capabilities → stac_search → stac_describe_scene → stac_download_bands or stac_compute_index - Collections: sentinel-2-l2a (optical, 10m), landsat-c2-l2 (optical, 30m), sentinel-1-grd (SAR radar, 10m), cop-dem-glo-30 (elevation, 30m)
Example: caps = await stac_capabilities()
| Name | Required | Description | Default |
|---|---|---|---|
| output_mode | No | json |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It explains the tool is read-only (listing capabilities) and details the return structure. However, it does not explicitly state that it does not modify server state, but this is clear from context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is somewhat lengthy but well-structured with sections (Args, Returns, Tips, Example). The first sentence delivers the core purpose, and every section adds value. Minor redundancy in the returns section listing what's in the JSON.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite no output schema, the description fully explains the return values (catalogs, collections, band mappings, spectral indices) and provides a typical workflow and example. It completely covers what an agent needs.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description fully compensates by documenting the only parameter 'output_mode' with allowed values (json/text) and default, adding meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'List server capabilities: catalogs, collections, and band info.' It distinguishes itself from sibling tools (e.g., stac_search, stac_describe_scene) by being a top-level discovery tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'Tips for LLMs' section explicitly advises calling this tool first, provides a typical workflow, and explains when to use it vs. other tools. This is exemplary guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
stac_compute_indexA
Compute a spectral index (e.g., NDVI, NDWI) for a scene.
Automatically downloads the required bands, computes the index formula, and stores the result as a single-band float32 raster.
Supported indices:
ndvi: Vegetation (NIR - Red) / (NIR + Red)
ndwi: Water (Green - NIR) / (Green + NIR)
ndbi: Built-up (SWIR16 - NIR) / (SWIR16 + NIR)
evi: Enhanced Vegetation 2.5*(NIR - Red) / (NIR + 6Red - 7.5Blue + 1)
savi: Soil-Adjusted Vegetation ((NIR - Red) / (NIR + Red + 0.5)) * 1.5
bsi: Bare Soil ((SWIR16 + Red) - (NIR + Blue)) / ((SWIR16 + Red) + (NIR + Blue))
Args: scene_id: Scene identifier from a previous search index_name: Index to compute (ndvi, ndwi, ndbi, evi, savi, bsi) bbox: Optional crop bbox in EPSG:4326 [west, south, east, north] cloud_mask: Apply SCL-based cloud masking before computation (Sentinel-2 only) output_format: Output format - "geotiff" (default) or "png" output_mode: Response format - "json" (default) or "text"
Returns: JSON with artifact_ref and value_range for the computed index
Tips for LLMs: - Use stac_capabilities to see all available indices and required bands - Interpretation guide: - NDVI: >0.6 dense vegetation, 0.2-0.6 moderate, <0.2 bare/water - NDWI: >0 water, <0 land; useful for flood mapping - NDBI: >0 built-up, <0 natural land cover - EVI: similar to NDVI but corrects for atmospheric and soil effects - SAVI: like NDVI but better in areas with sparse vegetation - BSI: >0 bare soil, <0 vegetated - Only works for optical collections (Sentinel-2, Landsat) - Enable cloud_mask=True for cleaner results with Sentinel-2 data - For temporal change analysis, compute the same index on multiple dates and compare value_range
Example: ndvi = await stac_compute_index( scene_id="S2B_...", index_name="ndvi", bbox=[0.85, 51.85, 0.95, 51.92] )
| Name | Required | Description | Default |
|---|---|---|---|
| bbox | No | ||
| scene_id | Yes | ||
| cloud_mask | No | ||
| index_name | Yes | ||
| output_mode | No | json | |
| output_format | No | geotiff |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It explains that the tool automatically downloads required bands, computes the index formula, and stores the result as a single-band float32 raster. It also describes the return format (JSON with artifact_ref and value_range). No contradictions with annotations (none provided). Could mention potential storage implications, but overall transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is somewhat lengthy with full formulas and tips, but it is well-structured: summary, supported indices list, args, returns, tips, example. Every section adds value, though a few details (like exact formulas) could be condensed if redundancy is avoided.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 6 parameters, no output schema, and no annotations, the description is comprehensive. It explains inputs, outputs, usage context, and provides interpretation tips. It feels complete for an AI agent to invoke correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate. It provides detailed parameter descriptions: scene_id, index_name with list and formulas, bbox format, cloud_mask explanation, output_format vs output_mode, and interpretation guides. This adds significant meaning beyond the raw schema, making it easy for an AI to use correctly.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool computes a spectral index like NDVI or NDWI for a scene. It specifies the verb 'compute' and the resource 'spectral index', distinguishing it from sibling tools like 'stac_download_bands' or 'stac_temporal_composite'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides usage context such as 'Only works for optical collections (Sentinel-2, Landsat)' and suggests using 'stac_capabilities' to see available indices. It advises enabling 'cloud_mask=True' for cleaner results and notes temporal change analysis. However, it does not explicitly state when not to use this tool or mention alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
stac_coverage_checkA
Check if cached scenes fully cover a requested bounding box.
Rasterizes the target bbox into a grid and checks which cells are covered by the provided scenes. Useful for planning mosaics to ensure gap-free coverage.
Args: bbox: Target bounding box [west, south, east, north] in EPSG:4326 scene_ids: Scene identifiers (must be cached from prior stac_search calls) output_mode: Response format - "json" (default) or "text"
Returns: JSON with coverage percentage and uncovered areas
Tips for LLMs: - Call this before stac_mosaic to verify scenes fully cover your area of interest - If coverage is less than 100%, search for more scenes or widen the date range to find additional tiles - Scenes must have been found by a prior stac_search call
Example: check = await stac_coverage_check( bbox=[0.8, 51.8, 1.0, 51.95], scene_ids=["S2B_...", "S2A_..."] )
| Name | Required | Description | Default |
|---|---|---|---|
| bbox | Yes | ||
| scene_ids | Yes | ||
| output_mode | No | json |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. It explains the rasterization process and output format, but doesn't mention read-only nature or other behavioral traits like rate limits. Still transparent enough for safe use.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well-structured with Args, Returns, Tips, and Example. Each section is useful, though slightly verbose. Front-loaded with the main purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema, but description explains the JSON return format with coverage percentage and uncovered areas. Adequately complete for the tool's purpose.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so description fully compensates by explaining bbox format (EPSG:4326), scene_ids requirement (cached from stac_search), and output_mode default. Adds meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Check if cached scenes fully cover a requested bounding box,' using a specific verb and resource. This distinguishes it from siblings like stac_mosaic and stac_search.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit usage guidance: 'Call this before stac_mosaic to verify scenes fully cover your area of interest' and tips for handling insufficient coverage. Also specifies scenes must be from prior stac_search.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
stac_describe_collectionA
Get detailed information about a STAC collection.
Returns band wavelengths, recommended composites, supported spectral indices, cloud masking info, and LLM-friendly usage guidance.
For known collections (Sentinel-2, Landsat, Sentinel-1, DEM), provides rich metadata including band names needed for download tools. Unknown collections still return live STAC metadata.
Args: collection_id: Collection identifier. Options: sentinel-2-l2a, sentinel-2-c1-l2a, landsat-c2-l2, sentinel-1-grd, cop-dem-glo-30 catalog: Catalog name (default: earth_search). Options: earth_search, planetary_computer, usgs output_mode: Response format - "json" (default) or "text"
Returns: JSON with band details, composites, spectral indices, and guidance
Tips for LLMs: - Call this to discover band names before using stac_download_bands - The composites field lists pre-defined band combinations (e.g., true_color = [red, green, blue]) - The spectral_indices field shows which indices this collection supports - The llm_guidance field contains domain-specific usage advice - Check cloud_mask_band — if None, the collection is non-optical (SAR radar or DEM) and cloud_mask=True will fail
Example: detail = await stac_describe_collection( collection_id="sentinel-2-l2a" )
| Name | Required | Description | Default |
|---|---|---|---|
| catalog | No | ||
| output_mode | No | json | |
| collection_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full behavioral disclosure. It describes the return content for known collections (rich metadata) and unknown collections (live STAC metadata). It also mentions the output_mode parameter and warns about cloud_mask_band being None for non-optical collections. This is transparent about what the tool does and does not do.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with a clear first line, bullet-like list of returns, then sections for Args, Returns, and Tips. Every sentence adds value—there is no verbosity or redundancy. It is front-loaded with the core purpose, then progressively elaborates.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having no output schema and 3 parameters, the description covers what an agent needs: expected return content (band details, composites, indices, guidance), handling of unknown collections, parameter options, and integration tips with sibling tools (e.g., stac_download_bands). It also addresses an edge case (cloud_mask_band None). This is comprehensive for the tool's relatively simple role.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description fully compensates by listing each parameter with its options (e.g., collection_id options: sentinel-2-l2a, landsat-c2-l2, etc.; catalog options: earth_search, planetary_computer, usgs; output_mode options: json or text). This adds significant meaning beyond the schema's basic type/required information.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description begins with a clear statement of purpose: 'Get detailed information about a STAC collection.' It specifies what is returned (band wavelengths, composites, spectral indices, etc.) and distinguishes from sibling tools by focusing on collections (vs. scenes or listings). The verb 'describe' and object 'collection' are specific and unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description includes a 'Tips for LLMs' section that explicitly recommends calling this tool before using stac_download_bands, and advises checking cloud_mask_band for non-optical collections. This provides clear usage context but does not directly compare with alternative sibling tools (e.g., stac_search or stac_list_collections) nor state when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
stac_describe_sceneA
Get detailed information about a specific scene.
Shows all available assets/bands, properties, CRS, and download URLs. The scene must have been returned by a previous stac_search call.
Args: scene_id: Scene identifier from a search result (use scene_id from stac_search) output_mode: Response format - "json" (default) or "text"
Returns: JSON with full scene details including all assets, CRS, and properties
Tips for LLMs: - Call this after stac_search to see available bands before downloading - The assets list shows every downloadable band and its resolution - Use the band keys (e.g., red, nir, scl) in stac_download_bands - Check cloud_cover to decide if the scene is usable
Example: detail = await stac_describe_scene( scene_id="S2B_MSIL2A_20240715T105629_N0510_R094_T31UCR_20240715T143301" )
| Name | Required | Description | Default |
|---|---|---|---|
| scene_id | Yes | ||
| output_mode | No | json |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. It explains what is returned but does not disclose behavioral traits like read-only nature, authentication, or error handling. Adequate but not thorough.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well-structured with purpose, args, returns, tips, and example. No unnecessary sentences; every part adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 2 parameters and no output schema, the description covers purpose, inputs, expected output, and usage context. Includes tips linking to stac_download_bands, making it complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description compensates fully: explains scene_id as a search result identifier and output_mode as format with default. Adds meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Get detailed information' and the resource 'scene'. It distinguishes from siblings like stac_describe_collection and stac_search by focusing on a single scene's details.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states prerequisite ('scene must have been returned by a previous stac_search call') and provides context for when to use ('after stac_search'). Does not explicitly exclude scenarios but offers clear guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
stac_download_bandsA
Download specific bands from a scene as a GeoTIFF or PNG.
Reads band COGs via HTTP, windows to the requested bbox, and stores the result in chuk-artifacts. The bbox should be in EPSG:4326 — CRS reprojection to the raster's native CRS is handled automatically.
Args: scene_id: Scene identifier from a previous stac_search call bands: Band names to download. Common names: - Sentinel-2: red, green, blue, nir, swir16, swir22, rededge1-3, scl - Landsat: red, green, blue, nir08, swir16, swir22, coastal, qa_pixel - Sentinel-1: vv, vh - DEM: data bbox: Optional crop bbox in EPSG:4326 [west, south, east, north]. Strongly recommended to avoid downloading full tiles output_format: "geotiff" (default, lossless, for analysis) or "png" (8-bit lossy with percentile stretch, for preview/display) cloud_mask: Apply SCL-based cloud masking (Sentinel-2 only). Masked pixels become 0 (integer) or NaN (float) output_mode: Response format - "json" (default) or "text"
Returns: JSON with artifact_ref, shape, dtype, and optional preview_ref
Tips for LLMs: - Use stac_describe_scene first to see available band names - Always provide a bbox to limit download size - Use output_format="png" when the user wants to see the image - GeoTIFF preserves full radiometric precision for analysis - A PNG preview is auto-generated alongside GeoTIFF downloads - For RGB visualisation, prefer stac_download_rgb (simpler) - For spectral indices, prefer stac_compute_index (automatic)
Example: result = await stac_download_bands( scene_id="S2B_...", bands=["red", "nir"], bbox=[0.85, 51.85, 0.95, 51.92] )
| Name | Required | Description | Default |
|---|---|---|---|
| bbox | No | ||
| bands | Yes | ||
| scene_id | Yes | ||
| cloud_mask | No | ||
| output_mode | No | json | |
| output_format | No | geotiff |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden. It discloses that it reads COGs via HTTP, windows to bbox, stores in chuk-artifacts, handles CRS reprojection, auto-generates PNG preview. It does not explicitly mention limits or auth, but adequately covers the core behavior. Minor gap in listing potential side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with clear sections (intro, Args, Returns, Tips, Example). While somewhat verbose, every sentence adds value. The front-loading of the main purpose and tips makes it efficient. Could be slightly more concise, but clarity is excellent.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (6 params, no output schema, no annotations), the description covers all necessary context: parameter semantics, return value format, usage tips, and a concrete example. It compensates for the missing schema descriptions and output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It provides detailed explanations for all six parameters, including examples for band names per satellite, bbox format, output format choices, cloud mask scope, and output mode. This adds significant meaning beyond the raw schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Download specific bands from a scene as a GeoTIFF or PNG.' The verb 'download' and resource 'bands from a scene' are specific. It distinguishes from siblings by explicitly mentioning alternatives like stac_download_rgb and stac_compute_index.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'Tips for LLMs' section provides explicit guidance: use stac_describe_scene first, always provide a bbox, prefer png for viewing, geotiff for analysis, and prefer sibling tools for RGB or indices. It clearly states when to use this tool vs alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
stac_download_compositeA
Download a multi-band composite from a scene.
Creates a composite from any combination of bands. Band order determines RGB channel mapping (first=R, second=G, third=B).
Args: scene_id: Scene identifier from a previous stac_search call bands: Band names for the composite (order = R,G,B channels). Common recipes: - ["nir", "red", "green"] — false colour infrared (vegetation=red) - ["swir16", "nir", "red"] — agriculture (crops=bright green) - ["swir16", "swir22", "red"] — geology/minerals composite_name: Label for the composite (e.g., "false_color_ir") bbox: Optional crop bbox in EPSG:4326 [west, south, east, north] output_format: "geotiff" (default, lossless) or "png" (8-bit preview) cloud_mask: Apply SCL-based cloud masking (Sentinel-2 only) output_mode: Response format - "json" (default) or "text"
Returns: JSON with artifact_ref for the composite
Tips for LLMs: - Use stac_describe_collection to see pre-defined composite recipes - Band order matters: first band → Red, second → Green, third → Blue - For true-colour RGB, use stac_download_rgb instead (simpler) - For single-value analysis, use stac_compute_index (e.g., NDVI)
Example: false_color = await stac_download_composite( scene_id="S2B_...", bands=["nir", "red", "green"], composite_name="false_color_ir" )
| Name | Required | Description | Default |
|---|---|---|---|
| bbox | No | ||
| bands | Yes | ||
| scene_id | Yes | ||
| cloud_mask | No | ||
| output_mode | No | json | |
| output_format | No | geotiff | |
| composite_name | No | custom |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so description carries full burden. Discloses band order mapping, cloud_mask limitation (Sentinel-2 only), output formats, and return format. Lacks explicit statements on side effects or auth needs, but overall transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well-structured with sections (Description, Args, Returns, Tips, Example). Slightly long but every sentence adds value. Could be slightly more concise, but appropriate for complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema and no annotations, description covers parameters, usage, return format, and alternatives. Lacks error handling or invalid input behavior, but sufficient for agent invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema has 0% description coverage, so description must compensate. It explains all parameters: scene_id from search, bands with examples, composite_name, bbox, output_format, cloud_mask, output_mode. Adds recipes and tips beyond schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Download a multi-band composite from a scene' and explicitly distinguishes from siblings like stac_download_rgb and stac_compute_index, making the purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit guidance: 'For true-colour RGB, use stac_download_rgb instead' and 'For single-value analysis, use stac_compute_index'. Also suggests using stac_describe_collection to see recipes, offering alternatives and context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
stac_download_rgbA
Download a true-color RGB composite from a scene.
Convenience wrapper around stac_download_bands that automatically selects red, green, blue bands. This is the simplest way to get a visual satellite image.
Args: scene_id: Scene identifier from a previous stac_search call bbox: Optional crop bbox in EPSG:4326 [west, south, east, north]. Strongly recommended to avoid downloading full tiles output_format: "geotiff" (default, lossless) or "png" (8-bit lossy, suitable for inline display by LLMs) cloud_mask: Apply SCL-based cloud masking (Sentinel-2 only) output_mode: Response format - "json" (default) or "text"
Returns: JSON with artifact_ref for the RGB composite
Tips for LLMs: - Use output_format="png" when the user wants to see the image — PNG can be rendered inline - GeoTIFF preserves full 16-bit precision but cannot be displayed inline - For false-color composites (e.g., NIR/Red/Green), use stac_download_composite instead - Only works for optical collections (Sentinel-2, Landsat) that have red, green, blue bands
Example: rgb = await stac_download_rgb(scene_id="S2B_...", output_format="png")
| Name | Required | Description | Default |
|---|---|---|---|
| bbox | No | ||
| scene_id | Yes | ||
| cloud_mask | No | ||
| output_mode | No | json | |
| output_format | No | geotiff |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden. It states it is a convenience wrapper, automatically selects bands, applies cloud masking optionally, and returns JSON with artifact_ref. It does not mention side effects (likely none), but is transparent about constraints (optical only). Minor gap: no explicit mention of idempotency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well-structured with summary, args, returns, and tips. Every sentence serves a purpose. The 'Tips for LLMs' is slightly long but adds practical value. Could be slightly more concise, but overall effective.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, description explains return format (JSON with artifact_ref). It covers parameters, usage context, and tips. Missing explicit error handling or prerequisites beyond optical collections, but still fairly complete for a 5-parameter tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so description must compensate. It describes scene_id, bbox (strongly recommended), output_format (geotiff vs png with use cases), cloud_mask (SCL-based, Sentinel-2 only), and output_mode (json or text). It adds value beyond schema, e.g., why bbox is important and when to use PNG. However, output_mode's options are not fully detailed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it downloads a true-color RGB composite from a scene, distinguishing it from stac_download_bands (convenience wrapper) and stac_download_composite (false-color). The verb 'download' and resource 'RGB composite' are specific and unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly provides when to use (RGB visual) and when not (false-color -> use stac_download_composite). Includes tips for LLMs on output_format choices, and states it only works for optical collections. This is comprehensive guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
stac_estimate_sizeA
Estimate download size for bands from a scene (no pixel data read).
Reads only COG headers to determine dimensions, dtype, and estimated file size. Use this before large downloads to understand how much data will be transferred.
Args: scene_id: Scene identifier from a previous search bands: Band names to estimate (e.g., ["red", "green", "blue", "nir"]) bbox: Optional crop bbox in EPSG:4326 [west, south, east, north] output_mode: Response format - "json" (default) or "text"
Returns: JSON with per-band size details and total estimate
Tips for LLMs: - Call this BEFORE large downloads to check feasibility - If estimated_mb > 500, suggest a smaller bbox or fewer bands - No pixel data is read — only COG headers, so this is very fast - Use the per-band breakdown to see which bands are largest (e.g., 10m bands are ~4x larger than 20m bands) - Useful for planning stac_mosaic or stac_temporal_composite where multiple scenes multiply the total data volume
Example: estimate = await stac_estimate_size( scene_id="S2B_...", bands=["red", "nir"], bbox=[0.85, 51.85, 0.95, 51.92] )
| Name | Required | Description | Default |
|---|---|---|---|
| bbox | No | ||
| bands | Yes | ||
| scene_id | Yes | ||
| output_mode | No | json |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It discloses that no pixel data is read (only COG headers), making it very fast. It describes the return format (JSON with per-band size details) and provides tips about band size comparisons. While thorough, it does not address error handling or edge cases, which would push it to a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured: a one-line summary, followed by Args, Returns, Tips for LLMs, and an Example. Every sentence adds value, and the structure is front-loaded with the core purpose. It is concise yet comprehensive.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's moderate complexity (4 params, 2 required, no output schema, no annotations), the description is complete. It covers all parameters, return values, use cases, and tips for integration with sibling tools (mosaic, composite). The example rounds out the completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate. It explains each parameter: scene_id, bands (with examples), bbox (format and CRS), and output_mode (default and alternatives). The example further clarifies usage. This adds substantial meaning beyond the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Estimate download size for bands from a scene (no pixel data read).' It specifies reading only COG headers to determine dimensions, dtype, and estimated file size. This distinguishes it from download tools and sibling tools like stac_download_bands.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit guidance on when to use: 'Use this before large downloads to understand how much data will be transferred.' Tips for LLMs further instruct: 'Call this BEFORE large downloads to check feasibility' and recommend actions if estimated_mb > 500. It also mentions planning for stac_mosaic or stac_temporal_composite, offering context for alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
stac_find_pairsA
Find before/after scene pairs for change detection.
Searches two date ranges and matches scenes by spatial overlap, useful for detecting changes between time periods (e.g., flood damage, urban growth, deforestation, seasonal vegetation change).
Args: bbox: Bounding box [west, south, east, north] in EPSG:4326 before_range: Before date range "YYYY-MM-DD/YYYY-MM-DD" after_range: After date range "YYYY-MM-DD/YYYY-MM-DD" collection: STAC collection (default: sentinel-2-l2a). Options: sentinel-2-l2a, sentinel-2-c1-l2a, landsat-c2-l2, sentinel-1-grd, cop-dem-glo-30 max_cloud_cover: Maximum cloud cover percentage 0-100 (default: 20). Ignored for non-optical collections (sentinel-1-grd, cop-dem-glo-30). catalog: Catalog name (default: earth_search). Options: earth_search, planetary_computer, usgs output_mode: Response format - "json" (default) or "text"
Returns: JSON with matched scene pairs sorted by overlap percentage
Tips for LLMs: - Best for change detection workflows: find pairs, then download the same bands for before/after scenes and compare - For flood mapping: use sentinel-1-grd (SAR sees through clouds) with before_range = dry season, after_range = flood event - For vegetation change: use sentinel-2-l2a, then compute NDVI for each scene in the pair - Higher overlap_percent means better spatial coverage for comparison - Follow up with stac_download_bands or stac_compute_index on each scene in the pair
Example: pairs = await stac_find_pairs( bbox=[0.8, 51.8, 1.0, 51.95], before_range="2024-01-01/2024-03-31", after_range="2024-07-01/2024-09-30" )
| Name | Required | Description | Default |
|---|---|---|---|
| bbox | Yes | ||
| catalog | No | ||
| collection | No | ||
| after_range | Yes | ||
| output_mode | No | json | |
| before_range | Yes | ||
| max_cloud_cover | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It describes the output format (JSON with matched pairs sorted by overlap percentage), notes that max_cloud_cover is ignored for non-optical collections, and explains the default values for collection, catalog, and output_mode. It lacks details on rate limits, authentication, or potential side effects, but these are not critical for a read-only search tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-organized with clear sections (main description, Args, Returns, Tips for LLMs, Example). It is concise yet comprehensive, front-loading the purpose and use case. Every sentence adds value, and the 'Tips for LLMs' section is particularly useful without being verbose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has 7 parameters (3 required), no output schema, and no annotations, the description provides complete context: parameter explanations, output format, practical use-case guidance, and an example. It adequately prepares an agent to use the tool correctly in a change detection workflow.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema description coverage is 0%, yet the 'Args' section in the description provides detailed explanations for every parameter: bbox format, date format for ranges, collection options, max_cloud_cover range and behavior, catalog options, and output_mode options. It also includes the default for max_cloud_cover and clarifies that it is ignored for non-optical collections. This adds substantial meaning beyond the raw schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly defines the tool's purpose: 'Find before/after scene pairs for change detection.' It explains the mechanism (searches two date ranges, matches by spatial overlap) and gives concrete use cases (flood damage, urban growth, deforestation, seasonal vegetation change). This clearly distinguishes it from sibling tools like stac_search or stac_compute_index.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'Tips for LLMs' section provides explicit guidance on when to use the tool (change detection workflows) and offers specific use-case recipes (flood mapping with sentinel-1-grd, vegetation change with sentinel-2-l2a). It also suggests follow-up tools (stac_download_bands, stac_compute_index). However, it does not explicitly state when not to use this tool or mention alternative tools for non-change-detection needs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
stac_get_artifactA
Retrieve a stored artifact and save it as a local file for viewing.
Downloads the artifact bytes from the artifact store and writes them to a local file. Returns the file path so the image can be opened in any viewer.
Args: artifact_ref: Artifact ID from a previous download tool call (the artifact_ref or preview_ref value) output_mode: Response format - "json" (default) or "text"
Returns: JSON with file_path, mime type, size, and artifact metadata
Tips for LLMs: - Use the preview_ref (PNG) from download results for quick viewing - Use the artifact_ref (GeoTIFF) for full-resolution geospatial data - The file is saved to a temporary directory and can be opened with any image viewer or GIS application - PNG files can be opened with: open (macOS) - GeoTIFF files can be opened with QGIS, rasterio, or similar
Example: result = await stac_get_artifact( artifact_ref="a7c666e6555548aea2d5351cc65bf173" ) # Returns: {"file_path": "/tmp/stac_artifacts/a7c666...png", ...}
| Name | Required | Description | Default |
|---|---|---|---|
| output_mode | No | json | |
| artifact_ref | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden. It explains that the file is saved locally and returns metadata, but does not specify cleanup or potential side effects. Still, it provides sufficient behavioral context for safe invocation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured: summary, args, returns, tips, example. It is somewhat lengthy but every sentence contributes value. Concise enough for a tool with two parameters.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, the description fully describes return values (file_path, mime type, size, metadata) and provides an example. Both parameters are explained. Completeness is high for this tool's complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate. It explains artifact_ref as 'Artifact ID from a previous download tool call' and distinguishes between preview_ref and artifact_ref. output_mode is mentioned with defaults. This adds significant meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Retrieve a stored artifact and save it as a local file for viewing.' It specifies the verb (retrieve/save) and resource (artifact), distinguishing it from sibling tools that handle downloads of bands or composites.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'Tips for LLMs' section provides guidance on when to use preview_ref vs artifact_ref, and mentions the file is saved to a temporary directory. However, it lacks explicit exclusion criteria or comparison with alternative tools, so it's not a perfect 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
stac_get_conformanceA
Check which STAC API features a catalog supports.
Reads the catalog's conformance URIs and matches them against known STAC API conformance classes to determine feature support (core, item_search, filter, sort, fields, query, collections).
Args: catalog: Catalog name (default: earth_search). Options: earth_search, planetary_computer, usgs output_mode: Response format - "json" (default) or "text"
Returns: JSON with feature support flags and raw conformance URIs
Tips for LLMs: - Rarely needed — most workflows don't require conformance checking - Useful for debugging when a catalog doesn't support expected features - Check for "query" support if advanced filtering is needed
Example: conformance = await stac_get_conformance(catalog="earth_search")
| Name | Required | Description | Default |
|---|---|---|---|
| catalog | No | ||
| output_mode | No | json |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden. It explains the internal behavior (reads conformance URIs, matches against known classes) and return format (JSON with flags and raw URIs). It implies a read-only, non-destructive operation, which is accurately disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is approximately 100 words, well-structured with sections (main, Args, Returns, Tips, Example). Each sentence serves a purpose—no redundancy. It is concise yet informative.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no annotations, no output schema, and 2 parameters, the description is remarkably complete: it covers purpose, parameters, return value, usage guidance, and provides an example. Missing details like error handling are minor; overall, it enables correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, but the description fully compensates. It enumerates allowed values for 'catalog' ('earth_search', 'planetary_computer', 'usgs'), default for 'output_mode' ('json'), and options ('text'). This adds meaning beyond the empty schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it checks which STAC API features a catalog supports, using a specific verb ('check') and resource ('catalog's conformance URIs'). It distinguishes from sibling tools like stac_capabilities and stac_search by focusing on feature support detection.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'Tips for LLMs' section explicitly states it's 'Rarely needed' and provides specific use cases (debugging, checking query support), guiding when to use and when not to. This is explicit guidance beyond typical descriptions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
stac_list_catalogsA
List all known STAC catalogs.
Returns pre-configured catalog endpoints that can be searched. Each catalog hosts different satellite collections.
Args: output_mode: Response format - "json" (default) or "text"
Returns: JSON with catalog names and endpoint URLs
Tips for LLMs: - Use stac_capabilities instead for a full overview including collections, bands, and indices - Default catalog is earth_search (AWS Element 84) - planetary_computer requires no API key (auto-authenticated)
Example: catalogs = await stac_list_catalogs()
| Name | Required | Description | Default |
|---|---|---|---|
| output_mode | No | json |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, but the description fully discloses that it is a read-only list operation returning JSON with catalog names and URLs. No hidden side effects or contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with Args, Returns, Tips, and Example sections. While slightly wordy, all content is relevant and earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema and simple functionality, the description sufficiently explains the return format (JSON with catalog names and endpoint URLs) and provides usage examples, making it complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The only parameter 'output_mode' is well described with allowed values ('json' or 'text') and default, compensating for the lack of schema descriptions (0% coverage).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it lists all known STAC catalogs and returns pre-configured endpoints. It distinguishes itself from sibling tools like stac_capabilities by noting that stac_capabilities provides a fuller overview.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly advises to use stac_capabilities for a full overview, mentions default catalog and auto-authentication for planetary_computer, giving clear context for when to use this tool vs alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
stac_list_collectionsA
List available collections in a STAC catalog.
Queries the catalog's live API to discover all hosted collections with titles, descriptions, and spatial/temporal extents.
Args: catalog: Catalog name (default: earth_search). Options: earth_search, planetary_computer, usgs output_mode: Response format - "json" (default) or "text"
Returns: JSON list of collections with titles, descriptions, and extents
Tips for LLMs: - Use this to discover what data is available in a specific catalog - For detailed band/composite info on a collection, follow up with stac_describe_collection - Different catalogs host different collections — if a collection isn't found, try another catalog
Example: collections = await stac_list_collections(catalog="earth_search")
| Name | Required | Description | Default |
|---|---|---|---|
| catalog | No | ||
| output_mode | No | json |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so the description carries full burden. It states it queries the live API (read-only), but does not mention authentication, rate limits, or error handling. Disclosure is adequate but could be more comprehensive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured: short purpose, clear sections for args/returns/tips, and an example. Every sentence adds value without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a listing tool with no output schema, the description covers input parameters, return format (JSON list with titles, descriptions, extents), and usage context. It is complete given the tool's simplicity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% but the description's Args section adds default values, options, and explanations for both parameters, providing significant meaning beyond the raw schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'List available collections in a STAC catalog', specifying the verb and resource. It differentiates from sibling tools by explicitly mentioning follow-up with stac_describe_collection for detailed info.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when-to-use guidance ('discover what data is available'), alternative catalogs, and a related tool for deeper detail (stac_describe_collection). Also suggests trying other catalogs if a collection is not found.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
stac_mapARead-only
Visualise STAC scene search results as a multi-layer footprint map. Scenes appear as bounding-box polygons, grouped by collection, with cloud cover, acquisition date, and thumbnail URL in the popup. Run stac_search first, then pass the scene_ids here.
| Name | Required | Description | Default |
|---|---|---|---|
| basemap | No | satellite | |
| scene_ids | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds behavioral context beyond the readOnlyHint annotation by detailing the map's visual elements (polygons, grouping, popup content). It confirms the tool is read-only and visual, consistent with the annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences efficiently convey purpose, visual output, and usage prerequisite. No redundant information, but could briefly mention the basemap parameter for completeness without adding much length.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has 2 parameters and no output schema, the description covers the main use case and prerequisite. However, it omits the basemap parameter and scene_ids format, leaving gaps for an agent to fully invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description should compensate. It mentions scene_ids and how to pass them ('pass the scene_ids here') but does not explain the format (e.g., comma-separated or array) nor the basemap parameter. This leaves ambiguity for the agent.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool visualizes STAC scene search results as a multi-layer footprint map, specifying what appears (bounding-box polygons grouped by collection) and details in popups. This distinguishes it from sibling tools like stac_mosaic or stac_pairs_map.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly instructs to run stac_search first and then pass scene_ids, providing a clear prerequisite and usage flow. It implies when to use this tool (after a search) but does not explicitly state when not to use alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
stac_mosaicA
Create a mosaic from multiple scenes.
Combines overlapping scenes into a single seamless raster. Useful when your area of interest spans multiple satellite tiles.
Args: scene_ids: List of scene identifiers to mosaic (from stac_search) bands: Bands to include (e.g., ["red", "green", "blue"]) bbox: Output bounding box [west, south, east, north] in EPSG:4326. Defaults to union of all scenes if not specified output_format: "geotiff" (default, lossless) or "png" (8-bit preview) cloud_mask: Apply SCL-based cloud masking per scene before merge (Sentinel-2 only) method: Merge method: - "last" (default): later scenes overwrite earlier in overlap areas - "quality": SCL-based best-pixel selection — picks the clearest pixel from overlapping scenes (Sentinel-2 only) output_mode: Response format - "json" (default) or "text"
Returns: JSON with artifact_ref for the mosaic raster
Tips for LLMs: - Use stac_coverage_check first to verify scenes cover the target area - Use method="quality" for cloud-free mosaics from Sentinel-2 data - Use method="last" for quick mosaics or non-optical data - For temporal compositing (e.g., seasonal median), use stac_temporal_composite instead
Example: mosaic = await stac_mosaic( scene_ids=["S2B_001", "S2B_002"], bands=["red", "green", "blue"], method="quality" )
| Name | Required | Description | Default |
|---|---|---|---|
| bbox | No | ||
| bands | Yes | ||
| method | No | last | |
| scene_ids | Yes | ||
| cloud_mask | No | ||
| output_mode | No | json | |
| output_format | No | geotiff |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully discloses behavior: combines scenes, defaults (bbox union, method='last'), Sentinel-2 limitations for cloud_mask and quality method, and output format. Discloses that output is JSON with artifact_ref.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well-structured with intro, parameter list, tips, and example. All sentences add value, but parameter explanations are slightly verbose. Still appropriate for the complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers all 7 parameters, required and optional, explains behavior, provides usage guidelines, tips, and an example. Output format is described. Complete for a tool with no annotations or output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema has 0% description coverage, but the tool description explains every parameter in detail, including defaults and usage examples. Completely compensates for missing schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Create a mosaic from multiple scenes' and explains it combines overlapping scenes into a seamless raster. It distinguishes from siblings like stac_temporal_composite by specifying it's for when area spans multiple tiles.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Includes explicit 'Tips for LLMs' that advise using stac_coverage_check first, choosing method='quality' for cloud-free mosaics, and redirecting to stac_temporal_composite for temporal compositing. Provides clear when-to-use and alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
stac_pairs_mapARead-only
Visualise before/after scene pairs from stac_find_pairs as a two-layer map. Blue = before, red = after. Toggle layers to compare footprint coverage between time periods.
| Name | Required | Description | Default |
|---|---|---|---|
| basemap | No | satellite | |
| after_scene_ids | No | ||
| before_scene_ids | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, indicating no side effects. The description adds behavioral detail: it renders a two-layer map with toggling capability for comparing coverage. This goes beyond the annotation by specifying visual behavior and interaction, without contradicting the read-only nature.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is exceptionally concise with two sentences, front-loading the core purpose and key details (colors, layer toggling). Every word adds value, no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's low complexity (visualization only), the description is largely complete for an agent to understand its role and basic usage. It could be improved by noting parameter formats (e.g., comma-separated IDs) or the basemap default, but such details are secondary for map generation purposes.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description must compensate. It indirectly explains that before_scene_ids and after_scene_ids come from stac_find_pairs, but does not describe valid formats, constraints, or the basemap parameter's possible values. The meaning is partially inferred from the tool name and context, but explicit parameter guidance is missing.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool visualizes before/after scene pairs from stac_find_pairs as a two-layer map with specific colors (blue=before, red=after) and action (toggle layers to compare). This specific verb+resource combination distinguishes it from siblings like stac_map (general map) and stac_find_pairs (search).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage after stac_find_pairs by referencing scene pairs from that tool. It explains the map's purpose and layer comparison, providing clear context. However, it does not explicitly state when not to use it or mention alternatives, though the sibling tools are listed elsewhere.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
stac_previewA
Get a preview/thumbnail URL for a scene.
Returns the URL of the scene's thumbnail or rendered preview image. Much faster than downloading full bands — useful for quick browsing.
The scene must have been returned by a previous stac_search call.
Args: scene_id: Scene identifier from a search result (use scene_id from stac_search) output_mode: Response format - "json" (default) or "text"
Returns: JSON with preview_url for the scene's thumbnail
Tips for LLMs: - Use for quick visual checks before committing to full band downloads - The preview URL is a remote image that can be displayed directly - Not all scenes have thumbnails — check for errors in the response
Example: preview = await stac_preview(scene_id="S2B_...")
| Name | Required | Description | Default |
|---|---|---|---|
| scene_id | Yes | ||
| output_mode | No | json |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden. It discloses the return format (preview_url), response modes (json/text), and that not all scenes have thumbnails. It is transparent about the operation being a quick preview, but could mention potential failure mode details (e.g., network issues).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with intro, details, tips, and example. Each sentence is informative; no waste. Slightly verbose but justified by the tips section. Front-loaded with purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 2 parameters, no output schema, and many siblings, the description is complete: explains prerequisites, return values, and usage limitations. It covers all necessary context for an AI agent to use the tool effectively.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, but the description fully explains both parameters: scene_id as from stac_search, output_mode with default and options. It provides an example, adding semantic clarity well beyond the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it retrieves a preview/thumbnail URL for a scene, distinguishing it from siblings like stac_download_bands (full band download) and stac_search (scene discovery). It emphasizes speed advantage, giving a specific verb+resource purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly notes the scene must come from a prior stac_search call, and advises using it for quick visual checks before full downloads. Tips mention checking for errors if no thumbnail exists, providing clear when-to-use and when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
stac_queryablesA
Fetch queryable properties from a STAC API.
Returns the properties that can be used in search queries, including their types and allowed values. Useful for understanding what filtering options are available.
Args: catalog: Catalog name (default: earth_search). Options: earth_search, planetary_computer, usgs collection: Optional collection to scope queryables (e.g., "sentinel-2-l2a" for collection-specific properties) output_mode: Response format - "json" (default) or "text"
Returns: JSON with queryable property names, types, and descriptions
Tips for LLMs: - Rarely needed — stac_search handles common filters automatically - Useful when debugging why searches return unexpected results - Different catalogs support different queryable properties
Example: queryables = await stac_queryables( catalog="earth_search", collection="sentinel-2-l2a" )
| Name | Required | Description | Default |
|---|---|---|---|
| catalog | No | ||
| collection | No | ||
| output_mode | No | json |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description explains the return format and behavior (e.g., different catalogs support different properties) but does not explicitly mention that the tool is read-only or any side effects. However, the overall behavior is transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with sections for purpose, args, returns, tips, and an example. It is concise and front-loaded with the most important information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
All relevant context is provided: purpose, parameters, return value, usage tips, and an example. No output schema exists, but the description covers the necessary details.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Despite 0% schema description coverage, the description fully explains each parameter: catalog options, collection example, and output_mode formats. This compensates entirely for the missing schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Fetch queryable properties from a STAC API' and explains the return value, distinguishing it from sibling tools like stac_search which handles actual searches.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'Tips for LLMs' section explicitly states when to use this tool ('rarely needed', 'useful when debugging') and names stac_search as an alternative, providing clear usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
stac_searchA
Search for satellite scenes matching spatial and temporal criteria.
This is the primary entry point for finding satellite imagery. Results are cached for follow-up describe/download operations.
Args: bbox: Bounding box [west, south, east, north] in EPSG:4326. Example: [-0.7, 52.7, 0.5, 53.7] for Lincolnshire, UK collection: STAC collection (default: sentinel-2-l2a). Options: - sentinel-2-l2a: Optical imagery, 10-20m resolution, 13 bands - sentinel-2-c1-l2a: Reprocessed Sentinel-2 archive - landsat-c2-l2: Optical imagery, 30m resolution, 11 bands - sentinel-1-grd: SAR radar, 10m, sees through clouds (VV/VH) - cop-dem-glo-30: Global elevation data, 30m date_range: Date range as "YYYY-MM-DD/YYYY-MM-DD" (optional). Omit for cop-dem-glo-30 (no temporal dimension) max_cloud_cover: Maximum cloud cover percentage 0-100 (default: 20). Ignored for non-optical collections (sentinel-1-grd, cop-dem-glo-30). Increase to 30-50 if getting zero results max_items: Maximum results to return (default: 10) catalog: Catalog name (default: earth_search). Options: earth_search, planetary_computer, usgs output_mode: Response format - "json" (default) or "text"
Returns: JSON with matching scenes sorted by cloud cover (optical) or date
Tips for LLMs: - Typical workflow: stac_search → stac_describe_scene → stac_download_bands - For cloudy regions (e.g., UK autumn), increase max_cloud_cover to 50 or use sentinel-1-grd (SAR radar, not affected by clouds) - For flood mapping: use sentinel-1-grd (water appears dark in VV/VH) - For vegetation analysis: use sentinel-2-l2a with NDVI index - For elevation/terrain: use cop-dem-glo-30 (no date_range needed) - If zero results, check the hints field for suggestions (try different catalog, increase cloud cover, widen date range) - Scenes are cached — use scene_id in subsequent describe/download calls
Example: results = await stac_search( bbox=[0.8, 51.8, 1.0, 51.95], date_range="2024-06-01/2024-08-31", max_cloud_cover=10 )
| Name | Required | Description | Default |
|---|---|---|---|
| bbox | Yes | ||
| catalog | No | ||
| max_items | No | ||
| collection | No | ||
| date_range | No | ||
| output_mode | No | json | |
| max_cloud_cover | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Despite no annotations, the description transparently discloses key behaviors: results are cached for follow-up operations, return format is JSON sorted by cloud cover or date, and hints field is provided for troubleshooting. It also specifies when parameters are ignored and the default catalog/collection. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with a brief summary, numbered arguments, returns, tips, and an example. It is front-loaded with the purpose, and every sentence adds value. While lengthy, it is not verbose given the complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity (7 parameters, no output schema, 23 sibling tools), the description is complete: it covers all parameter details, edge cases (e.g., omit date_range for cop-dem-glo-30), typical workflow, caching, and troubleshooting hints. It provides sufficient context for an AI agent to effectively use the tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description compensates fully by providing detailed semantics for all 7 parameters: bbox format with example, collection options with resolution and bands, date_range format, max_cloud_cover defaults and exceptions, max_items default, catalog options, and output_mode. It also includes tips and examples.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Search for satellite scenes matching spatial and temporal criteria' and identifies it as 'the primary entry point for finding satellite imagery'. This distinguishes it from siblings like stac_describe_scene and stac_download_bands, which are follow-up operations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly provides a typical workflow (stac_search → stac_describe_scene → stac_download_bands), offers tips for specific use cases (e.g., flood mapping, vegetation analysis), and advises when to adjust parameters (e.g., increase max_cloud_cover for cloudy regions, use sentinel-1-grd for SAR). It also notes when certain parameters are ignored (e.g., max_cloud_cover for non-optical collections) and suggests alternatives if zero results.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
stac_statusA
Get server status and configuration.
Returns information about the server version, available catalogs, and artifact store status. Use this to verify the server is running and check storage configuration.
Args: output_mode: Response format - "json" (default) or "text"
Returns: JSON with server status including version, storage provider, and default catalog
Tips for LLMs: - Call stac_capabilities instead if you need to plan a workflow (it returns collections, bands, and indices too) - Check artifact_store_available before attempting downloads
Example: status = await stac_status()
| Name | Required | Description | Default |
|---|---|---|---|
| output_mode | No | json |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. It describes return values (version, storage provider, default catalog) and hints at behavior (check artifact_store_available). However, it does not explicitly state that the operation is read-only or safe.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well-structured with clear sections (Args, Returns, Tips, Example). Every sentence adds value, and the total length is appropriate for the tool's complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple status tool with no output schema, the description adequately explains return values and includes a usage tip. It could mention error handling or the 'text' output format behavior, but overall is sufficiently complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema has one parameter (output_mode) with type and default but no description. The description does not explain the parameter's allowed values or impact on output format, nor does it describe any other parameter aspects. Despite 0% schema coverage, the description fails to compensate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description explicitly states 'Get server status and configuration' and lists the returned information, clearly distinguishing it from siblings by directing users to stac_capabilities for workflow planning.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit usage context: 'Use this to verify the server is running and check storage configuration.' Also includes tips for when to use alternatives (stac_capabilities) and when to check artifact_store_available before downloads.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
stac_temporal_compositeA
Create a temporal composite by combining multiple scenes statistically.
Searches for scenes in the date range, downloads bands from each, then combines them pixel-by-pixel using a statistical method. Useful for creating cloud-free composites from cloudy time series.
Args: bbox: Area of interest [west, south, east, north] in EPSG:4326 bands: Bands to composite (e.g., ["red", "green", "blue"]) date_range: Date range "YYYY-MM-DD/YYYY-MM-DD" method: Statistical method - "median" (default), "mean", "max", "min" collection: STAC collection (default: sentinel-2-l2a) max_cloud_cover: Maximum cloud cover 0-100 (default: 20) max_items: Maximum scenes (default: 10) catalog: Catalog name (default: earth_search) cloud_mask: Apply SCL cloud masking per scene before compositing output_format: Output format - "geotiff" (default) or "png" output_mode: Response format - "json" (default) or "text"
Returns: JSON with artifact_ref for the temporal composite
Tips for LLMs: - Method selection: - "median" (default): best for cloud-free composites — robust to outliers from clouds/shadows - "mean": smooth average, good for general baselines - "max": captures peak values (e.g., peak NDVI in a growing season) - "min": captures minimum values (e.g., lowest water extent) - Enable cloud_mask=True with Sentinel-2 for best results — masks clouds before compositing so they don't affect the statistics - Use a 2-3 month date range for seasonal composites - For per-date outputs instead of a single composite, use stac_time_series - Cloud cover filter is automatically skipped for non-optical collections (sentinel-1-grd, cop-dem-glo-30) - max_items defaults to 10 — increase for denser temporal sampling
Example: composite = await stac_temporal_composite( bbox=[0.85, 51.85, 0.95, 51.92], bands=["red", "green", "blue"], date_range="2024-06-01/2024-08-31", method="median" )
| Name | Required | Description | Default |
|---|---|---|---|
| bbox | Yes | ||
| bands | Yes | ||
| method | No | median | |
| catalog | No | ||
| max_items | No | ||
| cloud_mask | No | ||
| collection | No | ||
| date_range | Yes | ||
| output_mode | No | json | |
| output_format | No | geotiff | |
| max_cloud_cover | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Since no annotations are provided, the description carries the full burden. It explains the compositing workflow, automatic cloud filter skipping for non-optical collections, and default values. However, it does not mention whether the tool is read-only or has any side effects, which would be helpful.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with purpose, process, Args, Returns, Tips, and Example sections. It is front-loaded with the main purpose. While somewhat lengthy, every sentence adds value and the structure aids readability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (11 parameters, no output schema, no annotations), the description provides thorough coverage: explains output format, gives example usage, and offers practical tips. It could be more explicit about error handling, but overall it is complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema coverage, the description fully compensates by documenting all 11 parameters in the Args section, including formats (bbox, date_range), defaults (method, max_items), and domain knowledge (e.g., method options with guidance, cloud_mask rationale).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description starts with a clear statement: 'Create a temporal composite by combining multiple scenes statistically.' It explains the process of searching, downloading, and combining scenes, and distinguishes itself from sibling tool stac_time_series for per-date outputs.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit guidance on when to use this tool ('creating cloud-free composites from cloudy time series') and when not to ('For per-date outputs instead of a single composite, use stac_time_series'). It includes detailed tips for method selection and enables cloud_mask for best results.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
stac_time_seriesA
Extract a time series of band data over an area.
Searches for all scenes in the date range, downloads the requested bands for each, and returns references to the full temporal stack.
Args: bbox: Area of interest [west, south, east, north] bands: Bands to extract (e.g., ["red", "nir"]) date_range: Date range "YYYY-MM-DD/YYYY-MM-DD" collection: STAC collection (default: sentinel-2-l2a) max_cloud_cover: Maximum cloud cover 0-100 (default: 20) max_items: Maximum scenes to include (default: 50) catalog: Catalog name (default: earth_search) output_mode: Response format - "json" (default) or "text"
Returns: JSON with per-date artifact references
Tips for LLMs: - Use for monitoring change over time (vegetation growth, flood extent, urban expansion) - Pair with stac_compute_index on each date's artifact for temporal index analysis (e.g., NDVI over a growing season) - Keep bbox small — each date downloads full band data - Use max_cloud_cover=10 for cleaner optical time series - For a single cloud-free image from a date range, use stac_temporal_composite with method="median" instead - max_items limits the number of dates; set higher for dense temporal sampling or lower to reduce download volume - Cloud cover filter is automatically skipped for non-optical collections (sentinel-1-grd, cop-dem-glo-30)
Example: ts = await stac_time_series( bbox=[0.85, 51.85, 0.95, 51.92], bands=["red", "nir"], date_range="2024-01-01/2024-12-31", max_cloud_cover=10 )
| Name | Required | Description | Default |
|---|---|---|---|
| bbox | Yes | ||
| bands | Yes | ||
| catalog | No | ||
| max_items | No | ||
| collection | No | ||
| date_range | Yes | ||
| output_mode | No | json | |
| max_cloud_cover | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description bears full responsibility. It describes the search and download process, notes that cloud cover filtering is skipped for non-optical collections, and implies read-only behavior. Some details like error handling or performance guarantees are missing, but overall it is thorough.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is relatively long but well-structured with sections (Args, Returns, Tips, Example). The main purpose is front-loaded, and each sentence contributes value. Minor redundancy in tips (e.g., repeating max_items explanation) could be trimmed, but still efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity (8 parameters, no output schema, no annotations), the description is complete. It covers the tool's operation, usage constraints, return format, and includes a realistic example. No critical gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, but the description includes a detailed 'Args' section and 'Tips' that explain each parameter's purpose, default values, and behavior (e.g., max_cloud_cover 0-100, default 20). This adds significant meaning beyond the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Extract a time series of band data over an area,' which is a specific verb and resource. It distinguishes from siblings like stac_temporal_composite, which produces a single composite image.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit guidance on when to use this tool (monitoring change over time) and when not to (single cloud-free image, recommending stac_temporal_composite). It also includes tips on bbox size, cloud cover, and max_items.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
stac_zonal_statsA
Read out a raster's values within zones — the inference step after a fetch.
Given a stored raster artifact (e.g. an NDVI index from stac_compute_index, or any GeoTIFF from stac_download_bands) and target zones, return per-zone statistics (n_valid, mean, std, min, max, median, p10, p90).
Zones are either circular buffers around points, or GeoJSON polygons:
points: [[x, y], ...] centres in
zones_crs, each summarised withinbuffer_m.geojson: a geometry / Feature / FeatureCollection (polygons) in
zones_crs.
Pass background_m (> buffer_m) to also get a LOCAL ANOMALY readout: each
point's mean is compared to the surrounding annulus (buffer_m..background_m)
and reported as a z-score, with anomalous set when |z| >= z_threshold. This
is the direct "is the signal at this location anomalous vs its surroundings?"
answer — e.g. a cropmark/soil-mark over a buried feature in an NDVI raster.
Args: artifact_id: A GeoTIFF raster artifact (NOT a PNG preview). points: Zone centres [[x, y], ...] in zones_crs (e.g. BNG eastings/northings). buffer_m: Circular zone radius in metres (raster must be projected). background_m: Outer annulus radius in metres → enables the z-score readout. geojson: Alternative polygon zones (geometry/Feature/FeatureCollection). zones_crs: CRS of points/geojson, e.g. "EPSG:27700" (BNG) or "EPSG:4326". labels: Optional labels for points (e.g. HER refs). band: 1-based band index to read. z_threshold: |z| at/above which a point is flagged anomalous (default 2.0). output_mode: "json" or "text".
Returns: Per-zone statistics, plus a local z-score when background_m is given.
| Name | Required | Description | Default |
|---|---|---|---|
| band | No | ||
| labels | No | ||
| points | No | ||
| geojson | No | ||
| buffer_m | No | ||
| zones_crs | No | EPSG:4326 | |
| artifact_id | Yes | ||
| output_mode | No | json | |
| z_threshold | No | ||
| background_m | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. It discloses return of per-zone statistics and optional z-score anomaly detection, explains the logic, and notes the raster must be a GeoTIFF. Side effects and auth are not mentioned, but the read-only nature is implied.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with a summary, zone explanation, anomaly section, and parameter list. It is front-loaded with purpose. While long, every sentence adds value. Minor redundancy in zone explanation but overall efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 10 parameters, no output schema, and no annotations, the description covers all parameters, return values, and usage context. It mentions projection requirements and anomaly detection logic. Lack of explicit return format is compensated by clear per-zone statistics mention.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so description compensates fully. Each parameter is explained: points format, buffer_m meaning, geojson types, zones_crs examples, background_m enabling anomaly detection, etc. This adds substantial meaning beyond the schema types.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool reads raster values within zones, specifying it as the inference step after fetch. It distinguishes between buffer and polygon zones and gives concrete examples (NDVI index, GeoTIFF). This is specific and differentiates from sibling tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context on when to use (after fetch, with stored raster artifacts) and explains two zone input modes. It implicitly excludes PNG previews and gives anomaly detection use case. While it doesn't explicitly name alternatives, the context makes usage clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.
24 tool updates
v0.1.0- First observed
stac_capabilities - First observed
stac_compute_index - First observed
stac_coverage_check - First observed
stac_describe_collection - First observed
stac_describe_scene - First observed
stac_download_bands - First observed
stac_download_composite - First observed
stac_download_rgb - First observed
stac_estimate_size - First observed
stac_find_pairs - First observed
stac_get_artifact - First observed
stac_get_conformance - First observed
stac_list_catalogs - First observed
stac_list_collections - First observed
stac_map - First observed
stac_mosaic - First observed
stac_pairs_map - First observed
stac_preview - First observed
stac_queryables - First observed
stac_search - First observed
stac_status - First observed
stac_temporal_composite - First observed
stac_time_series - First observed
stac_zonal_stats
TDQS
Each tool serves a distinct purpose: capabilities overview, search, metadata description, various download modes (bands, RGB, composites), index computation, mosaicking, temporal compositing, time series extraction, zonal statistics, change detection pairs, coverage checking, size estimation, preview, artifact retrieval, and conformance checking. No two tools have overlapping functionality that would confuse an agent.
All tool names start with 'stac_' and use lowercase with underscores. However, there is inconsistency: many use verb_noun (e.g., stac_compute_index, stac_download_bands), while others use just nouns (e.g., stac_capabilities, stac_search, stac_map). The pattern is generally clear but not perfectly uniform.
With 24 tools, the server covers the full range of satellite imagery operations from discovery to analysis. While slightly on the higher side, each tool serves a specific need in the workflow, and the count is appropriate for the domain's complexity.
The tool surface covers the complete lifecycle: capabilities discovery, search, metadata inspection, multiple download options (bands, composites, RGB), index computation, mosaicking, temporal compositing, time series, change detection, zonal statistics, size estimation, and preview. No obvious gaps for a STAC client.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Geospatial AI MCP server — satellite imagery, embeddings, weather, GNS governance
- earthOAuthcom.mireye
MCP server for Mireye Earth — federal-source-cited geospatial data for any MCP-aware agent.
Hosted MCP server for finding authoritative primary data sources and official portals.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceA Model Context Protocol server that enables efficient discovery and retrieval of NASA Earth Data for geospatial analysis.26BSD 3-Clause
- AlicenseNot gradedqualityFmaintenanceA Model Context Protocol server implementation that provides geospatial analysis tools in Jupyter notebooks, particularly for downloading NASA Earth data granules.6BSD 3-Clause
- AlicenseAqualityCmaintenanceA Python MCP server that provides unified access to satellite and geospatial data through natural language queries, with automatic place name geocoding and support for raster, vector, and Zarr formats.24Apache 2.0
- FlicenseNot gradedqualityDmaintenanceMCP server for accessing SPEAR model output from various sources (AWS, STAC API, local) and integrating with AI assistants like Claude Desktop or a SPEAR Climate Chatbot.-
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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/IBM/chuk-mcp-stac'
If you have feedback or need assistance with the MCP directory API, please join our Discord server