Skip to main content

STAC MCP Server

PyPI Version Build Status CI Coverage Container Python License PyPI Downloads Ruff

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.

STAC Server MCP server

The coverage badge is updated automatically on pushes to main by 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

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 URIs
  • search_collections: List and search available STAC collections
  • get_collection: Get detailed information about a specific collection
  • search_items: Search for STAC items with spatial, temporal, and attribute filters
  • get_item: Get detailed information about a specific STAC item
  • estimate_data_size: Estimate data size for STAC items using lazy loading (XArray + odc.stac)

Capability Discovery & Aggregations

The new capability tools (ADR 0004) allow adaptive client behavior:

  • Graceful fallbacks: Missing /conformance, /queryables, or aggregation support returns structured JSON with supported:false instead of hard errors.
  • get_conformance falls back to the root document's conformsTo array when the dedicated endpoint is absent.
  • get_queryables returns an empty set with a message if the endpoint is not implemented by the catalog.
  • get_aggregations constructs a STAC Search request with an aggregations object; 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:latest

Examples

Example: JSON Output Mode

Below is an illustrative (client-side) pseudo-call showing output_format usage through an MCP client message:

{
  "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:

{"mode":"json","data":{"type":"item_list","count":5,"items":[{"id":"..."}]}}

This wrapping keeps the MCP content type stable while enabling machine-readable chaining.

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 -v

Test 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 -m

Example 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  # macOS

Configuration: .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:

  1. ruff format stac_mcp/ tests/
  2. ruff check stac_mcp/ tests/ --fix
  3. coverage run -m pytest -q
  4. coverage report -m (ensure no unexpected drops)

Linting

ruff format stac_mcp/ tests/
ruff check stac_mcp/ tests/ --fix --no-cache

Version 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.3

The 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:dev

Current Containerfile (single-stage) notes:

  • Based on python:3.12-slim for 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

STAC Resources

License

Apache 2.0 - see LICENSE file for details.

Metadata

Release files for iflow-mcp_wayfinder-foundry-stac-mcp 2.1.2

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for iflow-mcp_wayfinder-foundry-stac-mcp 2.1.2
File Size Uploaded
iflow_mcp_wayfinder_foundry_stac_mcp-2.1.2.tar.gz 41.5 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for iflow-mcp_wayfinder-foundry-stac-mcp 2.1.2
File Interpreter ABI Platform
iflow_mcp_wayfinder_foundry_stac_mcp-2.1.2-py3-none-any.whl Python 3 none any Details

Total release size: 90.4 kB

Release files / iflow_mcp_wayfinder_foundry_stac_mcp-2.1.2.tar.gz

Download URL iflow_mcp_wayfinder_foundry_stac_mcp-2.1.2.tar.gz
Size 41.5 kB
Tags Source
SHA-256 checksum
How to use checksums
d3dbdc191e7a5cae355d87576f2b5b91dbb222f7719f83c5f1dad63f1290f9ae
BLAKE2b-256 checksum
How to use checksums
6442e43fc24592a8729d0b63920b8de442e6f3d92ad0354767336d375e7afcbc
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.10.2 {"installer":{"name":"uv","version":"0.10.2","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Debian GNU/Linux","version":"13","id":"trixie","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

Release files / iflow_mcp_wayfinder_foundry_stac_mcp-2.1.2-py3-none-any.whl

Download URL iflow_mcp_wayfinder_foundry_stac_mcp-2.1.2-py3-none-any.whl
Size 49.0 kB
Tags Python 3
SHA-256 checksum
How to use checksums
0c8627468d8438afd333b0288c258b07757cc4df60e3bd34f4934da0ea72ddc9
BLAKE2b-256 checksum
How to use checksums
c0dcd6ff12985da2ec59e8ec82454be0a4357ae353ed52bef8bb7a2ce8ab17cb
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.10.2 {"installer":{"name":"uv","version":"0.10.2","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Debian GNU/Linux","version":"13","id":"trixie","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

Release history Release notifications | RSS feed

This release

2.1.2 This release

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page