Skip to main content
Glama
OpenLandMap MCP Server

OpenLandMap MCP Server

by tharlestsa

OpenLandMap MCP Server

MCP Server for the OpenLandMap STAC catalog — full access to global geospatial environmental data for AI agents.

Overview

OpenLandMap provides 104+ collections of global environmental data as Cloud-Optimized GeoTIFFs (COG), covering:

Theme

Examples

Soil

Organic carbon, pH, texture, bulk density, water content

Vegetation

EVI, FAPAR, forest cover, plant functional types

Land Cover

Land cover, land use, cropland, pasture, urban areas

Climate

Land surface temperature (LST), precipitation, bioclim

Terrain

DEM, slope, aspect, curvature, geomorphometry

Water

Water occurrence, snow cover

Atmosphere

NO2, water vapor, aerosol optical depth

Population

Population density, human footprint, wilderness

Related MCP server: source-coop-mcp

Installation

cd openlandmap-mcp

# Install with uv
uv pip install -e .

# Or run directly (uv resolves dependencies automatically)
uv run openlandmap-mcp

Configuration

Prerequisites: uv must be installed and available in PATH.

Claude Code

Add to .claude/settings.json (project-level) or ~/.claude/settings.json (global):

{
  "mcpServers": {
    "openlandmap": {
      "command": "uv",
      "args": ["run", "--directory", "/path/to/openlandmap-mcp", "openlandmap-mcp"]
    }
  }
}

Claude Desktop

Add to your claude_desktop_config.json:

OS

Path

macOS

~/Library/Application Support/Claude/claude_desktop_config.json

Windows

%APPDATA%\Claude\claude_desktop_config.json

Linux

~/.config/Claude/claude_desktop_config.json

{
  "mcpServers": {
    "openlandmap": {
      "command": "uv",
      "args": ["run", "--directory", "/path/to/openlandmap-mcp", "openlandmap-mcp"]
    }
  }
}

Gemini CLI

Add to ~/.gemini/settings.json (global) or .gemini/settings.json (project-level):

OS

Global path

Linux / macOS

~/.gemini/settings.json

Windows

%USERPROFILE%\.gemini\settings.json

{
  "mcpServers": {
    "openlandmap": {
      "command": "uv",
      "args": ["run", "--directory", "/path/to/openlandmap-mcp", "openlandmap-mcp"],
      "timeout": 60000
    }
  }
}

After configuration, verify with the /mcp command inside Gemini CLI to list connected servers and available tools.

ChatGPT Desktop

ChatGPT supports MCP servers exclusively via remote HTTP/SSE transport — local stdio processes are not supported. You need to expose the server over HTTP first.

Step 1 — Start the server with SSE transport:

uv run openlandmap-mcp --transport sse --port 8811

Step 2 — Expose locally (for development) or deploy publicly:

For local development, use a tunnel like ngrok:

ngrok http 8811
# Example output: https://abc123.ngrok.app

For production, deploy behind a reverse proxy with a public HTTPS URL.

Step 3 — Register in ChatGPT Desktop:

  1. Open Settings → Apps & Connectors → Advanced Settings

  2. Enable Developer Mode

  3. Go to Settings → Connectors → Create

  4. Fill in:

    • Name: OpenLandMap

    • Connector URL: https://abc123.ngrok.app/mcp (or your public URL)

    • Authentication: None (or configure as needed)

Note: ChatGPT does not support local config files for MCP. All registration is done through the UI. The server must be reachable over HTTPS.

Cursor / VS Code

Add to .cursor/mcp.json (Cursor) or .vscode/mcp.json (VS Code):

{
  "mcpServers": {
    "openlandmap": {
      "command": "uv",
      "args": ["run", "--directory", "/path/to/openlandmap-mcp", "openlandmap-mcp"]
    }
  }
}

Compatibility Matrix

Client

Transport

Config file

Local stdio

Claude Code

stdio

.claude/settings.json

Yes

Claude Desktop

stdio

claude_desktop_config.json

Yes

Gemini CLI

stdio

~/.gemini/settings.json

Yes

ChatGPT Desktop

HTTP/SSE

UI only (no file)

No

Cursor

stdio

.cursor/mcp.json

Yes

VS Code

stdio

.vscode/mcp.json

Yes


Capabilities

1. Catalog Discovery

Browse and search the entire OpenLandMap catalog.

catalog_info()

Returns root catalog metadata: ID, description, STAC version, total collection count.

"What data is available on OpenLandMap?"

list_collections(theme?, keyword?, limit?)

List collections with optional filters by theme alias or keyword search across titles, descriptions, and keywords.

"List all soil collections"
→ list_collections(theme="soil")

"Find collections related to organic carbon"
→ list_collections(keyword="organic carbon")

"Show the first 5 vegetation datasets"
→ list_collections(theme="vegetation", limit=5)

Available theme aliases: soil, vegetation, land_cover, climate, terrain, water, atmosphere, population

get_collection_schema(collection_id)

Returns the full schema of a collection: asset type definitions (MIME types, roles), STAC extensions used, spatial/temporal extent, contact info, style URLs (SLD/QML), and related links.

"Show me everything about the organic carbon collection"
→ get_collection_schema("organic.carbon_usda.6a1c")

discover_data_for_topic(topic)

Natural language search across all collection titles, descriptions, and keywords. Returns results ranked by relevance score.

"Find data about deforestation in the Amazon"
→ discover_data_for_topic("Amazon deforestation forest loss")

"What datasets exist for air quality analysis?"
→ discover_data_for_topic("air quality NO2 aerosol")

2. Collection Operations

Analyze, compare, and explore collections in depth.

compare_collections(collection_ids)

Side-by-side comparison of 2–10 collections: temporal coverage, resolution, units, keywords, and theme.

"Compare soil organic carbon and pH datasets"
→ compare_collections(["organic.carbon_usda.6a1c", "ph.h2o_usda.4c1a2a"])

get_collection_temporal_stats(collection_id)

Temporal statistics: earliest/latest dates, item count, year-by-year distribution, and median update interval.

"How often is the EVI dataset updated?"
→ get_collection_temporal_stats("evi_mod13q1.tmwm.inpaint")

Finds collections sharing the same theme or native category. Useful for discovering complementary datasets.

"What other datasets are related to land surface temperature?"
→ find_related_collections("lst_mod11a2.daytime")

get_soil_collections()

Shortcut returning all soil-related collections (bulk density, organic carbon, pH, sand/clay/silt, texture, water content, taxonomy).

"List all available soil datasets"
→ get_soil_collections()

get_vegetation_collections()

Shortcut returning all vegetation-related collections (EVI, FAPAR, forest cover, plant functional types).

"What vegetation indices are available?"
→ get_vegetation_collections()

get_land_cover_collections()

Shortcut returning all land cover/land use collections (classification, cropland, pasture, urban, change detection).

"Show me land cover datasets"
→ get_land_cover_collections()

3. Item Search & Access

Search and retrieve individual temporal snapshots within collections.

search_items(collection_id, bbox?, datetime_range?, limit?, offset?)

Search items with spatial (bounding box) and temporal (ISO 8601 interval) filters. Supports pagination.

"Find organic carbon data for the Cerrado region"
→ search_items("organic.carbon_usda.6a1c", bbox=[-60.47, -24.68, -41.28, -2.33])

"Get EVI data from 2015 to 2020"
→ search_items("evi_mod13q1.tmwm.inpaint", datetime_range="2015-01-01/2020-12-31", limit=10)

"Show all items in the land cover collection"
→ search_items("land.cover_esacci.lc.l4", limit=50)

get_item_detail(collection_id, item_id)

Full item details: geometry (GeoJSON), bounding box, temporal range, all assets with resolved URLs, MIME types, file sizes, and checksums.

"Show full details for the 2018 organic carbon item"
→ get_item_detail("organic.carbon_usda.6a1c", "organic.carbon_usda.6a1c_19500101_20171231")

list_items_temporal(collection_id)

Lists all items sorted chronologically. Shows the complete temporal coverage and update pattern of a dataset.

"What time periods are available for EVI?"
→ list_items_temporal("evi_mod13q1.tmwm.inpaint")

find_items_by_point(lon, lat, collection_ids?)

Given a WGS84 coordinate, finds all items covering that point across one or more collections.

"What data is available for Brasília?"
→ find_items_by_point(-47.9, -15.8)

"Find soil data at this location"
→ find_items_by_point(-47.9, -15.8, ["organic.carbon_usda.6a1c", "ph.h2o_usda.4c1a2a"])

4. Asset Access & Download

Resolve URLs and generate download instructions for data files.

get_asset_url(collection_id, item_id, asset_key)

Resolves the full S3 URL for a specific asset. Returns MIME type, roles, COG status, file size, checksum, and S3 bucket/key.

"Get the URL for the 0cm depth organic carbon layer"
→ get_asset_url("organic.carbon_usda.6a1c", "organic.carbon_usda.6a1c_19500101_20171231", "organic.carbon_usda.6a1c_m_250m_b0cm")

list_assets_for_item(collection_id, item_id)

Lists all assets (data layers, thumbnails, style files) with complete metadata for each.

"What files are available in this item?"
→ list_assets_for_item("organic.carbon_usda.6a1c", "organic.carbon_usda.6a1c_19500101_20171231")

get_all_data_assets(collection_id, item_id)

Filters to only data assets (role="data"), excluding thumbnails, QML, and SLD files. Returns direct COG URLs.

"Give me only the data layers, not the styles"
→ get_all_data_assets("organic.carbon_usda.6a1c", "organic.carbon_usda.6a1c_19500101_20171231")

get_asset_download_info(collection_id, item_id, asset_key)

Returns the direct URL plus ready-to-use commands and code snippets:

  • curl command for download

  • wget command for download

  • Python snippet using rasterio (streaming, no download needed)

  • R snippet using terra (streaming, no download needed)

"How do I access the soil carbon data programmatically?"
→ get_asset_download_info("organic.carbon_usda.6a1c", "organic.carbon_usda.6a1c_19500101_20171231", "organic.carbon_usda.6a1c_m_250m_b0cm")

get_visualization_assets(collection_id, item_id)

Returns visualization-related assets: thumbnails (PNG), QGIS layer styles (QML), and WMS style descriptors (SLD).

"Get the QGIS style file for this layer"
→ get_visualization_assets("organic.carbon_usda.6a1c", "organic.carbon_usda.6a1c_19500101_20171231")

5. Spatial Queries

Work with geographic regions and spatial coverage.

get_bbox_for_region(region_name)

Returns the WGS84 bounding box [west, south, east, north] for a named region. Supports ~50 regions:

  • Countries: brazil, usa, china, india, australia, germany, france, japan, mexico, argentina, colombia, south_africa, kenya, indonesia, etc.

  • Brazilian states: goias, mato_grosso, para, minas_gerais, sao_paulo, bahia, amazonas, tocantins, maranhao, rondonia, acre, roraima, amapa, etc.

  • Brazilian biomes: cerrado, amazon, amazonia_legal, caatinga, pantanal, mata_atlantica, pampa

  • Continents/regions: south_america, north_america, europe, africa, asia, southeast_asia, oceania, middle_east, global

"What's the bounding box for the Cerrado biome?"
→ get_bbox_for_region("cerrado")
# Returns: {"region": "cerrado", "bbox": [-60.47, -24.68, -41.28, -2.33]}

"Get the bbox for Goiás state"
→ get_bbox_for_region("goias")

find_collections_for_bbox(bbox, theme?)

Finds all collections whose spatial extent intersects the given bounding box. Optionally filters by theme.

"What soil data covers the Cerrado?"
→ find_collections_for_bbox([-60.47, -24.68, -41.28, -2.33], theme="soil")

"Find all datasets available for Southeast Asia"
→ find_collections_for_bbox([92.0, -11.0, 141.0, 28.0])

get_collection_spatial_coverage(collection_id)

Returns full spatial coverage: bounding box, GeoJSON polygon of the extent, ground sample distance (resolution in meters), and CRS.

"What is the spatial resolution of the elevation model?"
→ get_collection_spatial_coverage("dtm.bareearth_ensemble")

6. Analysis & Code Generation

Discover data by topic, analyze temporal coverage, and generate ready-to-use code.

get_data_timeline(collection_ids)

Generates a structured timeline showing data availability across 1–10 collections. Useful for planning multi-temporal analyses.

"Show me when soil and vegetation data overlap"
→ get_data_timeline(["organic.carbon_usda.6a1c", "evi_mod13q1.tmwm.inpaint"])

find_overlapping_datasets(collection_id, start_year, end_year)

Finds all other collections with temporal overlap in the given period. Useful for multi-variable correlation studies.

"What datasets overlap with land cover data between 2010 and 2020?"
→ find_overlapping_datasets("land.cover_esacci.lc.l4", 2010, 2020)

get_stac_item_as_geojson(collection_id, item_id)

Returns the item as a pure GeoJSON Feature, ready for use in any GIS tool, web map, or geospatial pipeline.

"Export this item as GeoJSON"
→ get_stac_item_as_geojson("organic.carbon_usda.6a1c", "organic.carbon_usda.6a1c_19500101_20171231")

build_python_snippet(collection_id, item_id, asset_key, operation)

Generates a ready-to-run Python code snippet using rasterio and matplotlib.

Operations: open, info, plot, clip_bbox, stats, export_csv

"Generate Python code to plot organic carbon data"
→ build_python_snippet("organic.carbon_usda.6a1c", "organic.carbon_usda.6a1c_19500101_20171231", "organic.carbon_usda.6a1c_m_250m_b0cm", "plot")

"Generate code to compute statistics"
→ build_python_snippet(..., operation="stats")

"Generate code to clip to a bounding box"
→ build_python_snippet(..., operation="clip_bbox")

build_r_snippet(collection_id, item_id, asset_key, operation)

Generates a ready-to-run R code snippet using terra and sf.

Operations: open, info, plot, clip_bbox, stats, export_csv

"Generate R code to open and plot this raster"
→ build_r_snippet("organic.carbon_usda.6a1c", "organic.carbon_usda.6a1c_19500101_20171231", "organic.carbon_usda.6a1c_m_250m_b0cm", "plot")

MCP Resources

Static data accessible via URI patterns:

URI

Description

stac://openlandmap/catalog

Root catalog metadata (ID, version, collection count)

stac://openlandmap/themes

Index of all collections organized by thematic category

stac://openlandmap/guide

Usage guide with quick-start instructions

stac://openlandmap/collection/{id}

Full metadata for a specific collection

stac://openlandmap/collection/{id}/item/{item_id}

Full item details including all assets

MCP Prompts

Pre-built workflow templates for common analysis patterns:

Prompt

Description

Parameters

explore_collection

Step-by-step exploration of a collection (schema, temporal coverage, assets, related data)

collection_id

find_data_for_analysis

Guided workflow to find data for a specific analysis (region + topic + period)

topic, region, period

download_workflow

Complete data access workflow with URLs, commands, and code snippets

collection_id, item_id


Usage Examples

"What data is available on OpenLandMap?"
"List all soil datasets"
"Find collections about organic carbon"
"Show the temporal coverage of evi_mod13q1.tmwm.inpaint"
"Find vegetation data for the Cerrado between 2015 and 2020"
"Generate a Python snippet to access EVI data"
"Compare soil collections: organic.carbon vs ph.h2o"
"What is the spatial resolution of the elevation dataset?"
"Find datasets that overlap temporally with land cover between 2010-2020"
"Generate R code to plot soil organic carbon"
"What data is available at coordinates -47.9, -15.8?"
"Export this STAC item as GeoJSON for use in QGIS"
"How do I download the bulk density dataset with curl?"
"Show me the QGIS style file for the pH collection"

Architecture

  • Static catalog: Data is served from S3 (Wasabi) as static STAC JSONs — no server-side search API

  • In-memory cache: Configurable TTL per resource type (1h catalog, 30min collections, 10min items)

  • Lazy loading: Collections fetched on demand with concurrent batch fetch (semaphore-limited) when global filtering is needed

  • No native dependencies: Pure Python and pre-built wheels only (no GDAL/GEOS compilation required)

  • Retry with backoff: Automatic retry (3 attempts, exponential delays 1s/2s/4s) for all HTTP requests

  • Thundering herd protection: Per-key async locks prevent duplicate fetches for the same resource

License

OpenLandMap data is distributed under CC-BY-SA-4.0.

Available Tools

27 tools
build_python_snippetA

Generate a ready-to-use Python code snippet for accessing a raster asset.

Supports multiple operations: open, info, plot, clip_bbox, stats, export_csv.

Args: collection_id: Collection identifier. item_id: Item identifier. asset_key: Asset key within the item. operation: Code operation to generate: 'open' — open the raster with rasterio 'info' — print raster metadata 'plot' — plot with matplotlib 'clip_bbox' — clip to a bounding box 'stats' — compute zonal statistics 'export_csv' — export values to CSV

Returns: Python code snippet as a string.

Example: build_python_snippet("organic.carbon_usda.6a1c", "organic.carbon_usda.6a1c_20180101_20181231", "organic.carbon_usda.6a1c_m_1km_b30cm_s", "plot")

Inputs: collection_id (required), item_id (required), asset_key (required), operation. Returns: result

build_r_snippetA

Generate a ready-to-use R code snippet for accessing a raster asset.

Uses terra, sf, and rstac packages.

Args: collection_id: Collection identifier. item_id: Item identifier. asset_key: Asset key within the item. operation: Code operation: 'open' — open with terra::rast() 'info' — print metadata 'plot' — plot the raster 'clip_bbox' — crop to bounding box 'stats' — compute statistics 'export_csv' — export to CSV

Returns: R code snippet as a string.

Example: build_r_snippet("organic.carbon_usda.6a1c", "organic.carbon_usda.6a1c_20180101_20181231", "organic.carbon_usda.6a1c_m_1km_b30cm_s", "plot")

Inputs: collection_id (required), item_id (required), asset_key (required), operation. Returns: result

catalog_infoA

Return metadata about the OpenLandMap STAC root catalog.

Returns the catalog identifier, description, STAC version, total number of collections, and conformance classes.

Example return: {"id": "openlandmap", "stac_version": "1.0.0", "total_collections": 104, ...}

Inputs: no named parameters.

compare_collectionsA

Compare multiple collections side by side.

Shows temporal coverage, resolution, variable/layer info, theme, and keyword overlap for each collection. Useful for deciding which dataset best fits an analysis.

Args: collection_ids: List of collection IDs to compare (2-10). Use list_collections() to discover IDs.

Returns: CollectionComparison with one entry per collection.

Example: compare_collections(["organic.carbon_usda.6a1c", "ph.h2o_usda.6a1c"])

Inputs: collection_ids (required).

discover_data_for_topicA

Discover relevant datasets for a research topic.

Given a natural language description of a topic (e.g., 'soil organic carbon', 'Amazon deforestation', 'air quality', 'snow cover'), searches across all collection titles, descriptions, and keywords to find relevant datasets ranked by relevance.

Args: topic: Research topic in natural language. Examples: 'carbono orgânico do solo', 'vegetation indices', 'land surface temperature', 'human footprint'.

Returns: TopicDiscovery dict with ranked results and total found.

Example: discover_data_for_topic("soil organic carbon") discover_data_for_topic("desmatamento na Amazônia")

Inputs: topic (required).

find_collections_for_bboxA

Find collections whose spatial extent intersects a bounding box.

Searches all collections for spatial overlap with the given area. Optionally filters by theme.

Args: bbox: Bounding box in WGS84 [min_lon, min_lat, max_lon, max_lat]. theme: Optional theme filter ('soil', 'vegetation', etc.).

Returns: List of CollectionMatch dicts with id, title, theme, extents.

Example: find_collections_for_bbox([-54, -18, -45, -12], theme="soil")

Inputs: bbox (required), theme. Returns: result

find_items_by_pointA

Find items that cover a specific geographic point.

Searches across one or more collections for items whose bounding box contains the given coordinate. Filters collections by spatial extent before fetching items.

Args: lon: Longitude in WGS84 (-180 to 180). lat: Latitude in WGS84 (-90 to 90). collection_ids: Collections to search. If None, searches all (filtered by spatial extent first, max 50).

Returns: List of ItemMatch dicts with collection_id, item_id, temporal info.

Example: find_items_by_point(-47.9, -15.8) # Brasília find_items_by_point(-47.9, -15.8, ["organic.carbon_usda.6a1c"])

Inputs: lon (required), lat (required), collection_ids. Returns: result

find_overlapping_datasetsA

Find datasets with temporal overlap for correlation analysis.

Given a collection and a year range, finds all other collections that have data within that period. Useful for multi-variable studies.

Args: collection_id: Reference collection identifier. start_year: Start year (inclusive). end_year: End year (inclusive).

Returns: List of OverlapInfo dicts with overlapping period details.

Example: find_overlapping_datasets("organic.carbon_usda.6a1c", 2010, 2020)

Inputs: collection_id (required), start_year (required), end_year (required). Returns: result

get_all_data_assetsA

Get only data assets (excluding thumbnails, styles).

Filters assets by role='data', returning only actual raster data layers (Cloud-Optimized GeoTIFFs). Useful when you need download URLs.

Args: collection_id: Collection identifier. item_id: Item identifier.

Returns: List of AssetInfo dicts with role 'data'.

Example: get_all_data_assets("organic.carbon_usda.6a1c", "organic.carbon_usda.6a1c_20180101_20181231")

Inputs: collection_id (required), item_id (required). Returns: result

get_asset_download_infoA

Get download instructions for an asset in multiple formats.

Returns the direct S3 URL plus ready-to-use commands and code snippets for curl, wget, Python (rasterio), and R (terra).

Args: collection_id: Collection identifier. item_id: Item identifier. asset_key: Asset key to get download info for.

Returns: DownloadInfo dict with url and code snippets.

Example: get_asset_download_info("organic.carbon_usda.6a1c", "organic.carbon_usda.6a1c_20180101_20181231", "organic.carbon_usda.6a1c_m_1km_b30cm_s")

Inputs: collection_id (required), item_id (required), asset_key (required).

get_asset_urlA

Resolve the full URL and metadata for a specific asset.

Returns the direct S3 URL, MIME type, roles, COG status, and S3 bucket/key for programmatic access.

Args: collection_id: Collection identifier. item_id: Item identifier. asset_key: Asset key within the item (e.g. the layer name).

Returns: AssetInfo dict with url, type, roles, is_cog, s3_bucket, s3_key.

Example: get_asset_url("organic.carbon_usda.6a1c", "organic.carbon_usda.6a1c_20180101_20181231", "organic.carbon_usda.6a1c_m_1km_b30cm_s")

Inputs: collection_id (required), item_id (required), asset_key (required).

get_bbox_for_regionA

Get the WGS84 bounding box for a named region.

Supports countries, Brazilian states, Brazilian biomes, continents, and macro-regions. Useful for building spatial queries.

Args: region_name: Region name (case-insensitive, underscores for spaces). Examples: 'brazil', 'goias', 'cerrado', 'europe', 'south_america', 'amazonia_legal', 'global'.

Returns: Dict with bbox [west, south, east, north] and region name. If not found, returns error with list of available regions.

Example: get_bbox_for_region("cerrado") # → {"region": "cerrado", "bbox": [-60.47, -24.68, -41.28, -2.33]}

Inputs: region_name (required).

get_collection_schemaA

Return the full schema of a collection including asset definitions.

Provides complete metadata: asset types with MIME types and roles, STAC extensions, spatial/temporal extent, contact info, style URLs, related links (DOI, documentation, thumbnail).

Args: collection_id: Collection identifier (e.g. 'organic.carbon_usda.6a1c'). Use list_collections() to discover available IDs.

Returns: CollectionSchema dict with all metadata fields.

Example: get_collection_schema("organic.carbon_usda.6a1c")

Inputs: collection_id (required).

get_collection_spatial_coverageA

Get the full spatial coverage details of a collection.

Returns the bounding box, a GeoJSON polygon of the extent, the native ground sample distance (resolution in meters), and the coordinate reference system.

Args: collection_id: Collection identifier.

Returns: SpatialCoverage dict with bbox, geometry, gsd, and CRS.

Example: get_collection_spatial_coverage("organic.carbon_usda.6a1c")

Inputs: collection_id (required).

get_collection_temporal_statsB

Get temporal statistics for a collection.

Returns earliest/latest dates, total item count, distribution by year, and estimated update frequency (median interval between items).

Args: collection_id: Collection identifier.

Returns: TemporalStats dict with dates, counts, and year distribution.

Example: get_collection_temporal_stats("evi_mod13q1.tmwm.inpaint")

Inputs: collection_id (required).

get_data_timelineA

Generate a structured timeline of data availability across collections.

Shows when data is available for each collection, useful for planning multi-temporal or multi-variable analyses.

Args: collection_ids: List of collection IDs (1-10).

Returns: DataTimeline dict with entries sorted chronologically.

Example: get_data_timeline(["organic.carbon_usda.6a1c", "evi_mod13q1.tmwm.inpaint"])

Inputs: collection_ids (required).

get_item_detailA

Get full details for a specific STAC item including all assets.

Returns complete metadata, bounding box, geometry, temporal range, and all available assets with resolved URLs, MIME types, roles, and file sizes.

Args: collection_id: Collection identifier. item_id: Item identifier within the collection.

Returns: ItemDetail dict with geometry, properties, and assets list.

Example: get_item_detail("organic.carbon_usda.6a1c", "organic.carbon_usda.6a1c_20180101_20181231")

Inputs: collection_id (required), item_id (required).

get_land_cover_collectionsB

List all land cover and land use collections.

Returns collections about land cover classification, cropland, pasture, urban areas, and land use change.

Returns: List of CollectionSummary dicts for land cover collections.

Inputs: no named parameters. Returns: result

get_soil_collectionsA

List all soil-related collections with depth information.

Shortcut for soil analysis. Returns collections about bulk density, organic carbon, pH, sand/clay/silt content, texture, water content, and soil taxonomy.

Returns: List of CollectionSummary dicts for soil collections.

Inputs: no named parameters. Returns: result

get_stac_item_as_geojsonA

Return a STAC item as a pure GeoJSON Feature.

Ready for use in any GIS system, web map, or geospatial tool. Strips STAC-specific fields and returns standard GeoJSON.

Args: collection_id: Collection identifier. item_id: Item identifier.

Returns: GeoJSON Feature dict with geometry, properties, and bbox.

Example: get_stac_item_as_geojson("organic.carbon_usda.6a1c", "organic.carbon_usda.6a1c_20180101_20181231")

Inputs: collection_id (required), item_id (required).

get_vegetation_collectionsB

List all vegetation-related collections.

Returns collections about EVI, FAPAR, forest cover, potential vegetation, and plant functional types.

Returns: List of CollectionSummary dicts for vegetation collections.

Inputs: no named parameters. Returns: result

get_visualization_assetsB

Get visualization-related assets: thumbnails, QML, SLD styles.

Returns assets useful for previewing and styling the data in GIS applications like QGIS (QML) or WMS services (SLD).

Args: collection_id: Collection identifier. item_id: Item identifier.

Returns: List of AssetInfo dicts with visualization roles.

Example: get_visualization_assets("organic.carbon_usda.6a1c", "organic.carbon_usda.6a1c_20180101_20181231")

Inputs: collection_id (required), item_id (required). Returns: result

list_assets_for_itemA

List all assets of a specific item with complete metadata.

Returns every asset including data layers, thumbnails, style files (SLD/QML), with URLs, MIME types, file sizes, and roles.

Args: collection_id: Collection identifier. item_id: Item identifier.

Returns: Dict mapping asset keys to AssetInfo dicts.

Example: list_assets_for_item("organic.carbon_usda.6a1c", "organic.carbon_usda.6a1c_20180101_20181231")

Inputs: collection_id (required), item_id (required).

list_collectionsA

List available data collections in the OpenLandMap catalog.

Supports filtering by thematic category and keyword search in title/description. Returns lightweight summaries for browsing.

Args: theme: Filter by theme alias ('soil', 'vegetation', 'climate', 'land_cover', 'terrain', 'water', 'atmosphere', 'population') or native theme name. Case-insensitive. keyword: Text search across title, description, and keywords. Case-insensitive. limit: Maximum number of results (1-200, default: 50).

Returns: List of CollectionSummary dicts with id, title, theme, temporal extent, item count, etc.

Example: list_collections(theme="soil", limit=10) list_collections(keyword="organic carbon")

Inputs: theme, keyword, limit. Returns: result

list_items_temporalA

List all items in a collection organized chronologically.

Shows the temporal coverage of the dataset — useful for understanding data availability and update frequency.

Args: collection_id: Collection identifier.

Returns: List of TemporalSlice dicts sorted by start date.

Example: list_items_temporal("evi_mod13q1.tmwm.inpaint")

Inputs: collection_id (required). Returns: result

search_itemsA

Search items in a STAC collection with spatial and temporal filters.

Items represent temporal snapshots of the collection's data. Each item contains one or more assets (Cloud-Optimized GeoTIFFs).

Args: collection_id: Collection ID (e.g. 'organic.carbon_usda.6a1c'). bbox: Bounding box in WGS84 [min_lon, min_lat, max_lon, max_lat]. Example: [-54.0, -18.0, -45.0, -12.0] (part of Cerrado). datetime_range: ISO 8601 interval. Examples: '2010-01-01/2020-12-31', '2015-06-01/..', '../2020-01-01' limit: Max items to return (1-200, default: 20). offset: Number of results to skip for pagination.

Returns: ItemCollection with total_matched, returned, items, next_offset.

Example: search_items("organic.carbon_usda.6a1c", bbox=[-54,-18,-45,-12], limit=5)

Inputs: collection_id (required), bbox, datetime_range, limit, +1 more.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    A3.6/5.0

    Scored across 27 tools

    Disambiguation3/5

    Most tools have distinct purposes, but there is some overlap that could cause confusion. For example, get_asset_url and get_asset_download_info both provide asset URLs, and list_assets_for_item overlaps with get_all_data_assets and get_visualization_assets in listing assets. The descriptions help differentiate, but an agent might struggle to choose between these similar tools.

    Naming Consistency5/5

    Tool names follow a consistent verb_noun pattern throughout, such as build_python_snippet, catalog_info, compare_collections, and find_collections_for_bbox. There are no deviations in naming conventions, making the set predictable and easy to understand.

    Tool Count2/5

    With 27 tools, the count is too high for the server's purpose of accessing and exploring geospatial data. Many tools could be consolidated (e.g., multiple asset-listing tools) or omitted without losing functionality, leading to potential overwhelm and inefficiency for agents.

    Completeness4/5

    The toolset provides comprehensive coverage for discovering, accessing, and analyzing OpenLandMap data, including catalog browsing, spatial/temporal queries, asset retrieval, and code generation. Minor gaps exist, such as no direct data manipulation or advanced analysis tools, but core workflows are well-supported.

    Maintenance

    ActivityInactive
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      B
      quality
      C
      maintenance
      Enables AI assistants to search and access geospatial datasets through STAC (SpatioTemporal Asset Catalog) APIs. Supports querying satellite imagery, weather data, and other geospatial assets with spatial, temporal, and attribute filters.
      11
      20
      MIT
    • A
      license
      A
      quality
      D
      maintenance
      Enables AI agents to discover and access 800TB+ of public geospatial data from Source Cooperative, with tools for listing organizations, products, files, and fuzzy search.
      6
      2
      MIT
    • A
      license
      A
      quality
      B
      maintenance
      Enables 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.
      29
      16
      Apache 2.0
    • A
      license
      A
      quality
      B
      maintenance
      Enables AI agents to autonomously discover, stream, and compute satellite analytics from free government Earth observation archives. Provides tools for STAC search, spectral indices, elevation profiles, SAR water detection, and sandboxed geospatial scripting.
      29
      Apache 2.0