STAC MCP Server
The STAC MCP Server enables AI assistants and applications to interact with STAC catalogs for geospatial data discovery and access.
Core Capabilities:
Search and browse collections - List available STAC collections with customizable limits
Get detailed collection/item information - Retrieve comprehensive metadata about specific collections and items
Advanced geospatial search - Find STAC items using spatial filters (bounding boxes, GeoJSON AOI), temporal ranges, and custom query parameters
Estimate data sizes - Calculate dataset sizes using lazy loading without downloading actual data
Multi-catalog support - Connect to Microsoft Planetary Computer or any STAC-compliant API
Area of Interest clipping - Automatically clip data to the smallest area when both bbox and GeoJSON AOI are provided
Batch processing - Handle multiple items efficiently with structured metadata retention
Provides access to STAC (SpatioTemporal Asset Catalog) APIs for discovering and accessing geospatial datasets including satellite imagery and weather data, with support for spatial and temporal queries across STAC-compliant catalogs
Click on "Deploy 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., "@STAC MCP Server search for recent satellite imagery over California from the last month"
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.
STAC MCP Server
An MCP (Model Context Protocol) Server that provides access to STAC (SpatioTemporal Asset Catalog) APIs for geospatial data discovery and access. Supports dual output modes (text and structured json) for all tools.
The coverage badge is updated automatically on pushes to
mainby the CI workflow.
Overview
This MCP server enables AI assistants and applications to interact with STAC catalogs to:
Search and browse STAC collections
Find geospatial datasets (satellite imagery, weather data, etc.)
Access metadata and asset information
Perform spatial and temporal queries
Related MCP server: GeoCroissant MCP Server
Features
Available Tools
All tools accept an optional output_format parameter ("text" default, or "json"). JSON mode returns a single MCP TextContent whose text field is a compact JSON envelope: { "mode": "json", "data": { ... } } (or { "mode": "text_fallback", "content": ["..."] } if a handler lacks a JSON branch). This preserves backward compatibility while enabling structured consumption (see ADR 0006 and ASR 1003).
get_root: Fetch root document (id/title/description/links/conformance subset)get_conformance: List all conformance classes; optionally verify specific URIsget_capabilities: Get a summary of STAC API capabilities (query, sort, fields, queryables, aggregation, filter)search_collections: List and search available STAC collectionsget_collection: Get detailed information about a specific collectionsearch_items: Search for STAC items with spatial, temporal, and attribute filtersget_item: Get detailed information about a specific STAC itemget_queryables: Get queryable properties for a collectionget_aggregations: Get aggregations for STAC itemsestimate_data_size: Estimate data size for STAC items using lazy loading (XArray + odc.stac)
Search Parameters
The search_items tool supports comprehensive STAC API search parameters:
collections: One or more collection IDs to searchbbox: Bounding box [west, south, east, north] or GeoJSON geometrydatetime: Datetime filter (e.g., "2020-01-01/2020-12-31")limit: Maximum number of items to returnquery: Query filter for propertiesfields: List of fields to include/exclude (e.g., ["id", "properties.datetime"])intersects: GeoJSON geometry for spatial intersection queriesids: List of specific item IDs to retrieve (batch fetch)sortby: Sort order (e.g., ["-properties.datetime"] for descending)sign_assets: If True and catalog is Planetary Computer, sign asset URLs for direct access
Pagination Support
Search responses include pagination metadata with cursor-based navigation links:
{
"type": "item_list",
"count": 10,
"items": [...],
"meta": {
"catalog_url": "https://example.com/stac",
"parameters": {...},
"returned": 10,
"has_more": true,
"links": [
{"rel": "next", "href": "https://example.com/stac/search?token=abc123"},
{"rel": "prev", "href": "https://example.com/stac/search?token=xyz789"}
]
}
}Planetary Computer Asset Signing
When working with Microsoft Planetary Computer catalogs, you can enable asset signing to get signed URLs for direct asset access:
{
"method": "tools/call",
"params": {
"name": "search_items",
"arguments": {
"collections": ["sentinel-2-l2a"],
"limit": 5,
"sign_assets": true
}
}
}Capability Discovery & Aggregations
The new capability tools (ADR 0004) allow adaptive client behavior:
Graceful fallbacks: Missing
/conformance,/queryables, or aggregation support returns structured JSON withsupported:falseinstead of hard errors.get_conformancefalls back to the root document'sconformsToarray when the dedicated endpoint is absent.get_queryablesreturns an empty set with a message if the endpoint is not implemented by the catalog.get_aggregationsconstructs a STAC Search request with anaggregationsobject; if unsupported (HTTP 400/404), it returns a descriptive message while preserving original search parameters.
Data Size Estimation
The estimate_data_size tool provides accurate size estimates for geospatial datasets without downloading the actual data:
Lazy Loading: Uses odc.stac to load STAC items into xarray datasets without downloading
AOI Clipping: Automatically clips to the smallest area when both bbox and AOI GeoJSON are provided
Fallback Estimation: Provides size estimates even when odc.stac fails
Detailed Metadata: Returns information about data variables, spatial dimensions, and individual assets
Batch Support: Retains structured metadata for efficient batch processing
Usage
MCP Protocol / Server Configuration
The server implements the Model Context Protocol (MCP) for standardized communication.
{
"stac": {
"command": "uvx",
"args": [
"--from",
"git+https://github.com/wayfinder-foundry/stac-mcp",
"stac-mcp"
],
"transport": "stdio",
}
}Published Image
# With Docker
docker run --rm -i ghcr.io/wayfinder-foundry/stac-mcp:latest
# With Podman
podman run --rm -i ghcr.io/wayfinder-foundry/stac-mcp:latestExamples
Example: Basic Search
{
"method": "tools/call",
"params": {
"name": "search_items",
"arguments": {
"collections": ["landsat-c2l2-sr"],
"bbox": [-122.5, 37.7, -122.3, 37.8],
"datetime": "2023-01-01/2023-01-31",
"limit": 5,
"output_format": "json"
}
}
}The server responds with a single TextContent whose text is a JSON string like:
{
"type": "item_list",
"count": 5,
"items": [{"id": "..."}],
"meta": {
"catalog_url": "https://example.com/stac",
"parameters": {...},
"returned": 5,
"has_more": false,
"links": []
}
}Example: Advanced Search with Sorting and Field Selection
{
"method": "tools/call",
"params": {
"name": "search_items",
"arguments": {
"collections": ["sentinel-2-l2a"],
"intersects": {
"type": "Point",
"coordinates": [-122.4194, 37.7749]
},
"sortby": ["-properties.datetime"],
"fields": ["id", "properties.datetime", "properties.eo:cloud_cover"],
"limit": 10,
"output_format": "json"
}
}
}Example: Batch Fetch Specific Items
{
"method": "tools/call",
"params": {
"name": "search_items",
"arguments": {
"ids": ["item1", "item2", "item3"],
"output_format": "json"
}
}
}Development
Local Development
git clone https://github.com/wayfinder-foundry/stac-mcp.git
cd stac-mcp
pip install -e ".[dev]"For local development with containers, you can use VS Code's Remote Containers extension with the provided .devcontainer configuration.
Testing
pytest -vTest Coverage
The project uses coverage.py (already a dependency was added) for measuring statement and branch coverage.
Quick run (terminal):
coverage run -m pytest -q
coverage report -mExample output (illustrative):
Name Stmts Miss Branch BrMiss Cover
---------------------------------------------------------------------
stac_mcp/observability.py 185 4 42 3 96%
stac_mcp/tools/execution.py 68 2 18 1 94%
... (others) ...
---------------------------------------------------------------------
TOTAL 620 20 140 9 96%Generate an HTML report (optional):
coverage html
open htmlcov/index.html # macOSConfiguration: .coveragerc enforces branch = True and omits tests/* and scripts/version.py. Update omit patterns only when necessary to keep metrics honest.
Recommended workflow before opening a PR:
ruff format stac_mcp/ tests/ruff check stac_mcp/ tests/ --fixcoverage run -m pytest -qcoverage report -m(ensure no unexpected drops)
Linting
ruff format stac_mcp/ tests/
ruff check stac_mcp/ tests/ --fix --no-cacheVersion Management
The project uses semantic versioning (SemVer) with automated version management based on PR labels or branch naming, implemented in .github/workflows/container.yml.
Automatic Versioning
When PRs are merged to main, the workflow determines the version increment using either PR labels or branch prefixes:
PR Labels (Recommended for Automated Tools)
Labels take priority over branch prefixes. Add one of these labels to your PR:
bump:patch or bump:hotfix → patch increment (0.1.0 → 0.1.1) for bug fixes
bump:minor or bump:feature → minor increment (0.1.0 → 0.2.0) for new features
bump:major or bump:release → major increment (0.1.0 → 1.0.0) for breaking changes
Branch Prefixes (For Human Contributors)
If no version bump label is present, the workflow falls back to branch prefix detection:
hotfix/, fix/, copilot/fix-, or copilot/hotfix/ branches → patch increment (0.1.0 → 0.1.1) for bug fixes
feature/ or copilot/feature/ branches → minor increment (0.1.0 → 0.2.0) for new features
release/ or copilot/release/ branches → major increment (0.1.0 → 1.0.0) for breaking changes
See CONTRIBUTING.md for detailed guidelines on version bumping.
Manual Version Management
You can also manually manage versions using the version script (should normally not be needed unless doing a coordinated release):
# Show current version
python scripts/version.py current
# Increment version based on change type
python scripts/version.py patch # Bug fixes (0.1.0 -> 0.1.1)
python scripts/version.py minor # New features (0.1.0 -> 0.2.0)
python scripts/version.py major # Breaking changes (0.1.0 -> 1.0.0)
# Set specific version
python scripts/version.py set 1.2.3The version system maintains consistency across:
pyproject.toml(project version)stac_mcp/__init__.py(version)stac_mcp/server.py(server_version in MCP initialization)
Container Development
To develop with containers:
# Build development image
docker build -f Containerfile -t stac-mcp:dev .
# Test the container
docker run --rm -i stac-mcp:dev
# Using docker-compose for development
docker-compose up --build
# For debugging, use an interactive shell (requires modifying Containerfile)
# docker run --rm -it --entrypoint=/bin/sh stac-mcp:devCurrent Containerfile (single-stage) notes:
Based on
python:3.12-slimfor broad wheel compatibility (rasterio, shapely, etc.)Installs GDAL/PROJ system libraries needed by rasterio/odc-stac
Installs the package with
pip install .Entrypoint:
python -m stac_mcp.server(stdio MCP transport)Multi-stage/distroless hardening can be reintroduced later (tracked by potential future ADR)
Documentation
FastMCP Guidelines and Architecture
STAC MCP includes comprehensive documentation for FastMCP patterns and agentic geospatial reasoning:
FastMCP Documentation: Complete guide to MCP decorators, resources, tools, and prompts for STAC workflows
DECORATORS.md: Choosing the right decorator for STAC operations
GUIDELINES.md: FastMCP architecture and usage patterns
PROMPTS.md: Agentic STAC search reasoning and methodology
RESOURCES.md: STAC catalog discovery and metadata patterns
CONTEXT.md: Context usage for logging and progress tracking
These documents provide guidance for:
AI agents reasoning about STAC catalog searches
Developers implementing STAC MCP features
Understanding the planned FastMCP integration (issues #69, #78)
Additional Documentation
Test Coverage Strategy: Testing approach and coverage goals
STAC Resources
License
Apache 2.0 - see LICENSE file for details.
Available Tools
11 toolsestimate_data_sizeC
Estimate the data size for a STAC query.
Inputs: collections (required), bbox, limit, query, +5 more. Returns: result
get_aggregationsC
Get aggregations for STAC items.
Inputs: collections (required), bbox, query, datetime, +1 more. Returns: result
get_capabilitiesA
Return a summary of STAC API capabilities.
Maps conformance classes to human-readable capability names, making it easier for agents to discover what features a catalog supports (e.g., query, sort, fields, aggregations).
Inputs: catalog_url, output_format. Returns: result
get_collectionB
Fetch a single STAC Collection by id.
Inputs: collection_id (required), catalog_url. Returns: result
get_conformanceC
Return server conformance classes.
Inputs: check, catalog_url. Returns: result
get_itemA
Get a specific STAC Item by collection and item ID.
Inputs: item_id (required), collection_id (required), catalog_url, sign_assets, +1 more. Returns: result
get_queryablesA
Get the queryable properties for a specific STAC collection by its ID.
Inputs: collection_id (required), catalog_url. Returns: result
get_rootC
Return the STAC root document for a catalog.
Inputs: catalog_url. Returns: result
get_sensor_registry_infoA
Get information about the STAC sensor registry.
Inputs: no named parameters. Returns: result
search_collectionsC
Return a page of STAC collections.
Inputs: limit, catalog_url. Returns: result
search_itemsC
Search for STAC items.
Inputs: ids, bbox, limit, query, +8 more. Returns: result
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 11 tools
Most tools are clearly distinct, but get_conformance and get_capabilities have some overlap in purpose (both describe server capabilities). However, get_capabilities maps to human-readable names, providing enough differentiation. Other tools like search_collections vs get_collection and search_items vs get_item are well separated.
All tool names follow a consistent verb_noun pattern using 'get_' or 'search_' prefixes with snake_case. The naming is predictable and uniform across the entire tool set.
With 11 tools, the server is well-scoped for a STAC API. Each tool serves a distinct purpose without being excessive or too sparse, covering the essential operations expected from a STAC catalog.
The tool set covers the standard STAC API surface including root, conformance, capabilities, collections, items, search, queryables, and aggregations. It also adds useful extras like data size estimation and sensor registry info, leaving no significant gaps for typical STAC workflows.
Maintenance
Related MCP Connectors
Search dynamical.org's open STAC catalog of weather & climate datasets (GFS, ECMWF, HRRR).
Geospatial AI MCP server — satellite imagery, embeddings, weather, GNS governance
Geodata for any place, inside your agent: map data, terrain, routes, satellite images, GIS files.
Routing, geocoding, places, matrix and map tools for location-aware AI workflows.
Related MCP Servers
- FlicenseAqualityDmaintenanceProvides access to the OpenLandMap STAC catalog, offering over 100 global environmental datasets including soil, climate, and vegetation data. It enables AI agents to discover, search, and retrieve Cloud-Optimized GeoTIFFs for global geospatial analysis.27-
- FlicenseAqualityBmaintenanceEnables discovering and searching Earth observation datasets from STAC catalogs, generating validated GeoCroissant metadata, inspecting document structure, and previewing records for geospatial ML workflows.12-
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to perform geospatial analysis, spatial data processing, vector and raster operations, coordinate transformations, spatial statistics, mapping, and access to climate, satellite, and other geospatial data through MCP-compatible clients.MIT
- AlicenseAqualityBmaintenanceEnables AI agents to autonomously discover, stream, and compute satellite analytics from free government Earth-observation catalogs such as Sentinel-2, Landsat, and Copernicus DEM, with zero API keys or configuration. It supports place-name geocoding, STAC scene search, cloud-native COG streaming for spectral indices, elevation profiles, SAR flood detection, and sandboxed custom geospatial scripts.2916Apache 2.0