Skip to main content
Glama
HarshShinde0

GeoCroissant MCP Server

by HarshShinde0

GeoCroissant MCP Server

GeoCroissant 및 그 geospatial 확장을 위한 Model Context Protocol (MCP) 서버입니다.

기능

  • EO 데이터셋 탐색 - STAC 컬렉션에 대한 키워드/주제 검색과 bbox + datetime + cloud cover 기반 공간 장면 검색을 라이브 Element84 Earth Search API(https://earth-search.aws.element84.com/v1, AWS Open Data)를 대상으로 수행하며, 센서 모달리티 분류(optical / radar / elevation) 및 테마 단축키(flood, wildfire, ndvi, dem, ...)를 제공합니다.

  • STAC -> GeoCroissant 생성 - 라이브 검색 결과를 검증된 GeoCroissant 문서로 변환합니다. schema.org coverage, CRS, eo:bands에서 파생된 밴드 구성 및 분광 메타데이터(µm 단위에서 nm 단위로 변환), 직접 에셋 URL을 위한 distribution FileObject, 그리고 장면당 하나의 행을 포함하는 RecordSet까지 포함됩니다.

  • 검증 도구로서의 공식 검증기 - mlcroissant(즉, mlcroissant validate와 동일한 엔진)에서 제공하는 오류 및 경고를 포함한 구조화된 합격/불합격 보고서를 생성합니다.

  • 심층 검사 - 핵심 메타데이터에 더해 GeoCroissant의 모든 속성까지: CRS, 공간/시간 해상도, 밴드 구성, 분광 밴드 메타데이터, 레코드 엔드포인트, 스키마/바이어스/샘플링 전략.

  • 구조 그래프 추출 - 라이브러리가 내부적으로 구축하는 방향성 다중 그래프를 노출합니다(Metadata / FileObject / FileSet / RecordSet / Field 노드, source/join/containment 에지).

  • 레코드 구체화 - 굉장이 실제 레코드 그래프(다운로드, 추출, 변환)를 실행하여 실제 레코드를 직접 미리 봅니다. Python의 Dataset.records(...)와 완전히 동일합니다.

  • 검증된 스캐폴딩 - 구조화된 파라미터로 표준에 부합하는 GeoCroissant JSON-LD를 생성하고, 실제 검증기로 검증합니다.

  • 내장된 스펙 참조 - 네임스페이스, 도메인/카디널리티를 포함한 모든 geoc: 속성, canonical @context, 샘플 문서, Python API를 제공합니다.

Related MCP server: Copernicus Earth Observation MCP Server

기능

도구

설명

list_eo_catalogs

등록된 EO STAC 카탈로그(Earth Search)의 모달리티, 컬렉션, 주제 키워드를 나열합니다.

search_eo_datasets

Earth Search 컬렉션에 대한 주제/키워드 검색 - 'flood'는 Sentinel-1 + Sentinel-2, 'dem'은 Copernicus DEM 등을 반환합니다.

search_eo_scenes

bbox 내 공간/시간/클라우드 커버 기반 장면 검색; 장면별 id, 날짜, 클라우드 커버, 기본 EPSG, 에셋 키를 반환합니다.

create_geocroissant_from_stac

end-to-end 파이프라인: 라이브 STAC 검색 -> 검증된 GeoCroissant JSON-LD(coverage, CRS, 밴드 및 분광 메타데이터, distribution URL, 포함된 인라인 장면 레코드) 생성. 선택적으로 디스크에 저장.

validate_croissant

Croissant/GeoCroissant 문서(파일 경로, URL 또는 인라인 JSON)를 검증하고 valid, errors, warnings, conformance targets를 반환합니다.

inspect_geocroissant

문서의 구조적 요약: 메타데이터, geocr: 속성, distribution 항목, 각 RecordSet/Field의 타입/형태 및 소스 연결 정보를 제공합니다.

get_structure_graph

라이브러리의 내부 구조 그래프에서 노드와 방향 에지 - 계보 및 의존성 분석.

list_record_sets

@id, 키, 인라인 레코드/예시 수, 중첩 필드 요약을 포함한 RecordSet 목록을 반환합니다.

get_records_preview

RecordSet의 처음 N개 레코드를 실체화(다운로드/변환 포함)하고 선택적으로 필터를 적용합니다. Python API와 동일합니다.

extract_distribution_urls

distribution의 다운로드 가능한 URL: contentUrl, 포맷, md5/sha256, FileSet 포함 여부를 반환합니다.

create_geocroissant_scaffold

파라미터로부터 검증된 GeoCroissant 문서를 생성합니다(네트워크 불필요). 선택적으로 디스크에 저장하는

get_geocroissant_spec_reference

스펙 참조 정보: overview, context, properties, example, python-api 또는 all.

카탈로그 추가

레지스트리는 데이터 기반(src/geocr_mcp_server/config/catalogs.yaml)입니다. 각 카탈로그는 STAC URL, 모달리티별로 관리되는 컬렉션, 그리고 공유 topics와 모달리티 키워드 힌트를 포함하는 항목입니다. 코드를 수정하지 않고 다른 카탈로그를 등록하려면:

  1. YAML을 복사하고 catalogs 아래에 카탈로그를 추가하세요(테마 매핑은 topics 아래에).

  2. 환경 변수로 해당 파일을 가리키도록 하세요:

"env": { "GEOCR_CATALOGS_CONFIG": "/path/to/catalogs.yaml" }

로더는 주제 참조가 어떤 카탈로그의 컬렉션 목록에 존재하는지 검증하므로, 시작 시 오타가 즉시 실패합니다.

권장 에이전트 워크플로우

discovery:  list_eo_catalogs -> search_eo_datasets("burn scar", modality=optical)
            -> search_eo_scenes(bbox=[...], datetime_range=...)
metadata:   create_geocroissant_from_stac(...)  # validated output + optional file
consuming:  inspect_geocroissant -> get_records_preview -> extract_distribution_urls
authoring:  create_geocroissant_scaffold -> edit -> validate_croissant

설치

클론이 필요 없습니다 - pip 또는 uvx가 GitHub에서 geocr-mcp와 그 mlcroissant 의존성을 바로 가져옵니다. 클론은 개발용으로만 필요합니다.

pip

pip install git+https://github.com/HarshShinde0/geocr_mcp.git@main

단일 의존성인 mlcroissant은 GeoCroissant 포크에서 자동으로 설치됩니다:

pip install git+https://github.com/HarshShinde0/croissant.git@main#subdirectory=python/mlcroissant

uv / uvx (클라이언트에 권장)

uvx --from "geocr-mcp @ git+https://github.com/HarshShinde0/geocr_mcp.git@main" geocr-mcp-server

Docker

docker build -t geocr-mcp-server .
# stdio (local clients):
docker run -i --rm geocr-mcp-server
# hosted (HTTP transports):
docker run -p 8000:8000 geocr-mcp-server --transport streamable-http --host 0.0.0.0 --port 8000

클라이언트 설정

클론이 필요 없습니다. 클라이언트는 uvx을 통해 이 두 패키지를 GitHub에서 직접 설치(그리고 캐시)합니다.

{
  "mcpServers": {
    "geocr": {
      "command": "uvx",
      "args": [
        "--from", "geocr-mcp @ git+https://github.com/HarshShinde0/geocr_mcp.git@main",
        "geocr-mcp-server"
      ],
      "env": {
        "FASTMCP_LOG_LEVEL": "ERROR"
      },
      "disabled": false,
      "autoApprove": []
    }
  }
}
{
  "mcp": {
    "servers": {
      "geocr": {
        "command": "uvx",
        "args": [
          "--from", "geocr-mcp @ git+https://github.com/HarshShinde0/geocr_mcp.git@main",
          "geocr-mcp-server"
        ],
        "env": {
          "FASTMCP_LOG_LEVEL": "ERROR"
        }
      }
    }
  }
}

서버 코드 자체를 개발 중일 때만 필요합니다:

git clone https://github.com/HarshShinde0/geocr_mcp.git   # or this monorepo
{
  "mcpServers": {
    "geocr": {
      "command": "uv",
      "args": [
        "--directory", "/path/to/geocr_mcp",
        "run", "geocr-mcp-server"
      ],
      "env": {
        "FASTMCP_LOG_LEVEL": "ERROR"
      },
      "disabled": false,
      "autoApprove": []
    }
  }
}

공유/원격 클라우드 사용을 위해 동일한 서버를 HTTP 전송으로 실행합니다:

geocr-mcp-server --transport streamable-http --host 0.0.0.0 --port $PORT

Render에 배포(원클릭 Blueprint)

이 저장소에는 render.yaml blueprint가 포함되어 있습니다:

  1. Render Dashboard에 로그인합니다.

  2. New + -> Blueprint를 클릭하고 HarshShinde0/geocr_mcp 저장소를 연결합니다.

  3. Apply를 클릭합니다. Render가 자동으로 컨테이너를 빌드해 서버를 배포합니다.

라이브 엔드포인트: https://geocr-mcp-server.onrender.com/mcp

호스팅된 MCP에 클라이언트 연결하기

AI 클라이언트, IDE 또는 에이전트 설정(mcpServers)에서:

{
  "mcpServers": {
    "geocr-remote": {
      "url": "https://geocr-mcp-server.onrender.com/mcp"
    }
  }
}

사용자 지정 리버스 프록시 뒤에서 TLS를 프록시에서 종료하고 GEOCR_HOST=0.0.0.0과 GEOCR_TRANSPORT=streamable-http로 설정하세요.

환경 변수

변수

기본값

설명

FASTMCP_LOG_LEVEL

WARNING

표준 에러 로그의 로그 레벨 (DEBUG, INFO, WARNING, ERROR)

GEOCR_OUTPUT_DIR

시스템 임시 디렉토리

생성된 파일이 쓰이는 장소 (파일 이름은 basename으로 변환되어 심각한)

GEOCR_CATALOGS_CONFIG

포함된 YAML

다른 카탈로그 레지스트리 파일 경로 - 코드 변경 없이 카탈로그/주제 minor 추가 기능

GEOCR_HOST / GEOCR_PORT

127.0.0.1 / 8000

SSE/streamable-http 전송의 바인딩 주소 (CLI 플래그로도 설정 가능)

보안 고려 사항

  • 서버는 도구 입력이 URL을 참조하거나 원격으로부터 레코드를 구체화할 때(get_records_preview)에만 네트워크 요청을 수행합니다. 신뢰할 수 없는 환경에서는 limit을 작게 유지하세요.

  • 생성된 파일은 항상 GEOCR_OUTPUT_DIR 안에 저장되며, 파일 이름을 basename으로 축소하여 이려움 경로 추적을 차단합니다.

  • 컨테이너는 비-루트(non-root) 사용자로 실행하세요(제공된 Dockerfile이 이미 그렇게 합니다).

개발

cd geocr_mcp
uv venv && uv sync --all-groups     # or: python -m pip install -e ".[dev]"
uv run pytest --cov --cov-branch    # unit tests (no network required)
uv run ruff check src tests         # lint (same rules as awslabs/mcp)
npx @modelcontextprotocol/inspector geocr-mcp-server   # interactive debugging

Available Tools

12 tools
create_geocroissant_from_stacA

Searches live EO data and generates VALIDATED GeoCroissant metadata from it.

    This is the flagship end-to-end pipeline of this server:

    1. Runs a real STAC search (bbox + collections + datetime + cloud cover).
    2. Derives GeoCroissant properties from the results: schema.org spatial/
       temporal coverage, CRS (EPSG:4326), record endpoint, band
       configuration and spectral band metadata from `eo:bands`
       (micrometers converted to nanometers), distribution FileObjects for
       direct asset URLs, and a RecordSet with one inline row per scene.
    3. Validates the document through the official `mlcroissant` library
       before returning it.

    Usage: THE tool for turning discovered EO data into GeoCroissant.
    After generation use `inspect_geocroissant`, `get_records_preview`
    and `extract_distribution_urls` on the output.

    Returns:
    --------
    Dictionary containing:
        - valid/errors/warnings: mlcroissant validation outcome.
        - json_ld: The generated GeoCroissant document.
        - path: Output file path when output_filename was given.
        - search_summary: What was searched and how many scenes matched.
    
ParametersJSON Schema
NameRequiredDescriptionDefault
bboxYesBounding box as [min_lon, min_lat, max_lon, max_lat].
nameYesName for the generated dataset.
limitNoNumber of scenes to include (1-50).
licenseNoLicense URL.
creatorsNoCreator names.
modalityNoModality used to pick default collections.
collectionsNoExplicit STAC collection ids.
descriptionNoDescription of the generated dataset.
datetime_rangeNoSTAC datetime interval.
max_cloud_coverNoMax cloud cover percentage.
output_filenameNoWhen provided, writes the validated JSON-LD into GEOCR_OUTPUT_DIR (or temp dir) and returns the path.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full behavioral burden. It openly discloses that this runs a real STAC search, derives specific metadata properties, validates through mlcroissant, returns a structured dictionary, and optionally writes to a file when output_filename is provided. This is far more than generic 'creates metadata' and gives the agent a reliable model of side effects and outcomes.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is longer than typical, but it deserves the length: a high-level summary, numbered pipeline steps, usage guidance, and a structured returns breakdown. It is scannable and avoids filler. The only minor issue is some near-duplication between the numbered pipeline and the Returns section, but overall the structure earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity with 11 parameters, no annotations, and a rich transformation pipeline, the description covers the key decision-relevant context: input search criteria, output validation, the return dictionary shape, and follow-up tool recommendations. Nothing critical is missing for an agent to decide to call it and interpret the result correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already covers every parameter with 100% description coverage, including defaults, ranges, and types. The tool description contributes little parameter-specific semantics beyond grouping bbox, collections, datetime, and cloud cover as search criteria, and mentioning output_filename in the return path. This meets the baseline but does not add substantial new parameter meaning.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Searches live EO data and generates VALIDATED GeoCroissant metadata from it.' It distinguishes itself from sibling tools by framing itself as the flagship end-to-end pipeline and naming follow-up inspection tools rather than other generators. This gives an agent a clear, unambiguous understanding of what this tool does.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly states this is the tool for turning discovered EO data into GeoCroissant and suggests follow-up sibling tools to use after generation. It does not explicitly contrast with create_geocroissant_scaffold or list search-only siblings, so no exclusionary guidance is given, but the context of when to invoke it is sufficiently clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_geocroissant_scaffoldA

Generates a validated GeoCroissant JSON-LD scaffold from parameters.

    Produces a standards-conformant starting point modeled on the official
    GeoCroissant example: correct @context (including the `geocr` prefix),
    dual conformance (`croissant/1.1` + `geocr`), schema.org spatial/temporal
    coverage, GeoCroissant properties (CRS, resolutions, band configuration,
    spectral bands), distribution entries and a RecordSet wired to them via
    proper cr:source/cr:extract declarations.

    The generated document is then parsed and checked by the real
    ``mlcroissant`` validator, so `valid=True` means the scaffold already
    passes the official library checks.

    Usage: Call FIRST when creating new dataset metadata, then edit the
    returned JSON-LD for domain specifics and re-check with
    `validate_croissant`. Use `inspect_geocroissant` afterwards to review it.

    Returns:
    --------
    ScaffoldResult containing:
        - valid: Whether the scaffold passed mlcroissant validation.
        - json_ld: The generated document.
        - errors/warnings: Library messages when not fully clean.
        - path: Output file path when output_filename was given.
    
ParametersJSON Schema
NameRequiredDescriptionDefault
bboxNoSpatial coverage as [min_lon, min_lat, max_lon, max_lat] in EPSG:4326 (standard GIS order).
nameYesName of the dataset.
licenseNoLicense URL, preferably SPDX, e.g. "https://creativecommons.org/licenses/by/4.0/".
versionNoDataset version, e.g. "1.0".
creatorsNoCreator names (rendered as sc:Organization entries).
file_setsNoList of FileSet specs: {"id": "images", "name": "Images", "encoding_format": "image/tiff", "includes": "images/**/*.tif"}.
band_namesNoOrdered raster band names, e.g. ["Blue","Green","Red","NIR"].
field_nameNoName of the main data Field inside the RecordSet.data
descriptionNoDescription of the dataset.
file_objectsNoList of FileObject specs: {"id": "data.zip", "name": "data.zip", "content_url": "https://...", "encoding_format": "application/zip", "sha256": "...", "md5": "..."}.
date_publishedNoPublication date as YYYY-MM-DD.
field_is_arrayNoWhether the main Field is an array (raster/tensor).
spectral_bandsNoPer-band spectral metadata entries like {"name": "Blue", "centerWavelength": {"value": 490, "unitText": "nm"}, "bandwidth": {...}}.
field_data_typeNoField dataType, e.g. "sc:ImageObject", "sc:Text", "sc:URL".sc:ImageObject
output_filenameNoWhen provided, writes the validated JSON-LD to this filename inside GEOCR_OUTPUT_DIR (or the system temp dir) and returns the path.
record_set_nameNoName/@id of the scaffolded RecordSet.records
field_array_shapeNoArray shape as comma-separated dims, e.g. "512,512,6" (requires field_is_array=True).
temporal_coverageNoTemporal coverage interval, e.g. "2018-01-01/2021-12-31".
source_file_set_idNo@id of the FileSet/FileObject the main Field reads from. Defaults to the first declared distribution entry.
spatial_resolutionNoGround sampling distance value (with unit below).
record_set_descriptionNoDescription of the scaffolded RecordSet.
spatial_resolution_unitNoUnit for spatial_resolution, e.g. "m".m
temporal_resolution_unitNoUnit for temporal cadence, e.g. "days".days
temporal_resolution_valueNoRevisit cadence value (with unit below).
coordinate_reference_systemNoCRS identifier, e.g. "EPSG:4326".

Output Schema

ParametersJSON Schema
NameRequiredDescription
pathNoFile path when the scaffold was written to disk.
validYesWhether the generated JSON-LD passes mlcroissant validation.
errorsNoValidation errors on the generated file.
json_ldYesThe generated JSON-LD document.
warningsNoValidation warnings on the generated file.

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

There are no annotations, so the description carries full responsibility, and it delivers: it explains the scaffold passes mlcroissant validation, what valid=True means, that errors/warnings may be returned when not fully clean, and that an output file path is provided when output_filename is used. This is more than what annotations alone would have provided.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with a clear purpose, detail section, usage instruction, and Returns list. It is somewhat long, and the Returns section overlaps with the existing output schema, so a small amount of redundancy prevents a 5.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a highly parameterized tool with 25 parameters, the description is complete: it explains the generation workflow, validation guarantees, how to continue after creation, what the result contains, and the optional file-writing side effect. An agent has enough context to call and use the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

All 25 parameters have schema descriptions, so the input schema already carries most semantic weight. The tool description adds context about how parameters map into the generated JSON-LD (CRS, resolutions, bands, RecordSet wiring), but it does not explain individual parameters beyond the schema. This matches the baseline for a schema with complete coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb-resource pair: 'Generates a validated GeoCroissant JSON-LD scaffold from parameters.' It clearly differentiates from the STAC-based sibling by emphasizing 'from parameters' and stating the output is modeled on the official GeoCroissant example and validated by mlcroissant.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives a clear workflow: call this first when creating new dataset metadata, then edit the scaffold and re-check with validate_croissant, and review with inspect_geocroissant. However, it does not explicitly mention the main alternative sibling create_geocroissant_from_stac or state when someone should use that instead.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

extract_distribution_urlsA

Extracts downloadable URLs from a Croissant document's distribution.

    Collects the `contentUrl` of every FileObject together with its encoding
    formats, sizes and checksums, plus FileSet include patterns and archive
    containers. These are the direct access points for the dataset bytes.

    Usage: Use this tool to obtain concrete download links (e.g. GeoTIFF /
    COG / ZIP assets) for ingestion code without parsing the JSON manually.

    Returns:
    --------
    DistributionUrls containing:
        - urls: One entry per distribution item (name, type, contentUrl,
          encodingFormat, md5/sha256, includes/containedIn when present).
        - count: Number of distribution items with at least one URL.
    
ParametersJSON Schema
NameRequiredDescriptionDefault
jsonld_urlNoURL of a Croissant/GeoCroissant JSON-LD document.
jsonld_pathNoPath to a local Croissant/GeoCroissant file.
jsonld_contentNoRaw JSON string of a Croissant document.

Output Schema

ParametersJSON Schema
NameRequiredDescription
urlsYesOne entry per FileObject/FileSet: name, contentUrl(s), encodingFormat and hashes when declared.
countYesNumber of distribution entries with URLs.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries full responsibility. It thoroughly explains what is extracted, the output structure, and the count semantics. Potential error conditions or network behavior are not mentioned, but for a pure extraction tool this is adequate.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with a one-sentence purpose, followed by a compact extraction details list, a usage note, and a structured return section. There is slight redundancy between 'downloadable URLs' and 'contentUrl', but every block adds useful context without excessive length.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given three optional parameters and a defined output schema, the description provides all necessary context: the purpose of starting extraction, a compressed return value structure, and number of items. An agent can correctly invoke the tool with any of the three compatible input sources and interpret the output.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

All three input parameters (jsonld_url, jsonld_path, jsonld_content) already have descriptions in the schema, so schema coverage is 100%. The description does not add parameter-specific guidance; however, since the schema handles that, the baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb-object pair ('Extracts downloadable URLs from a Croissant document's distribution') and enumerates the exact data captured: contentUrl per FileObject, encoding formats, sizes, checksums, FileSet includes patterns. This fully differentiates it from sibling tools like inspect_geocroissant or get_structure_graph, which handle different aspects.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The 'Usage' sentence clearly states when to invoke this tool: to obtain concrete download links (e.g., GeoTIFF/COG/ZIP) for ingestion code without parsing the JSON manually. It does not explicitly list exclusions or alternative tools, but the primary use case is unambiguous.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_geocroissant_spec_referenceA

Returns the GeoCroissant specification reference documentation.

    Provides the vocabulary cheat sheet distilled from the official GeoCroissant
    specification: namespace IRIs and prefixes, conformance declarations, every
    `geocr:` property with expected types/domains/cardinality, the canonical
    JSON-LD @context, a full sample document, and Python snippets for the
    ``mlcroissant`` API (load, validate, iterate records).

    Usage: Read this ONCE before authoring or editing GeoCroissant documents so
    property names, types and cardinalities match the specification exactly.
    Then use `create_geocroissant_scaffold` and `validate_croissant`.

    Returns:
    --------
    Markdown-formatted reference documentation for the requested topic.
    
ParametersJSON Schema
NameRequiredDescriptionDefault
topicNoWhich part of the specification to return. One of: "overview", "context" (@context snippet), "properties" (all geocr properties), "example" (full sample document), "python-api" (mlcroissant usage snippets), "all" (everything).all

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

There are no annotations, so the description carries the behavioral burden. It clearly states the tool returns Markdown-formatted reference documentation and implies read-only behavior with 'Returns' and 'Read this once'. It does not explicitly state that it has no side effects, but nothing suggests mutation or external changes.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is detailed but not bloated; the opening sentence states the primary purpose, followed by a useful content breakdown and a 'Usage' section. The RETURN section is a little redundant with the first line, but every part contributes meaning.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter, read-only documentation tool, the description provides enough detail: what to expect, what is included, when to use it, and what follows. An output schema is present, and the description already covers the return format.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The single 'topic' parameter is fully documented in the schema with all of the valid options described. The description adds no information beyond the schema, so it meets but does not exceed the baseline for a fully covered parameter.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Returns the GeoCroissant specification reference documentation'. It then details exactly what the documentation contains (properties, domains, cardinalities, JSON-LD context, sample, Python snippets), which fully distinguishes this from authoring, validation, and inspection siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit context: 'Read this ONCE before authoring or editing GeoCroissant documents' and then directs the agent to create_geocroissant_scaffold and validate_croissant. It does not strongly contrast with inspecting or searching tools, but it clearly places the reference tool in a workflow.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_records_previewA

Materializes the first records of a RecordSet by executing the data pipeline.

    This tool runs the real ``mlcroissant`` operation graph: it downloads (or
    resolves locally) the declared FileObjects/FileSets, applies extracts and
    transforms, and yields actual records - exactly what
    ``Dataset.records(record_set)`` yields in Python.

    Usage: Use it to preview/sample a dataset's actual data before writing
    training code, or to sanity-check that a generated Croissant description
    produces the expected columns and values.

    IMPORTANT: For remote distributions this may download data; keep `limit`
    small on large datasets. Datasets with inline `cr:data` return those rows
    directly without downloads.

    Returns:
    --------
    RecordsPreview containing:
        - record_set: The RecordSet @id that was read.
        - columns: Column names found across returned records.
        - rows: List of records keyed by fully-qualified field ids.
        - truncated: True if more records exist beyond `limit`.
    
ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of records to return (1-100).
filtersNoOptional single-entry filter {field_id: value}, e.g. {"my_recordset/split": "train"} (only supported for fields extracted via regex transformations).
jsonld_urlNoURL of a Croissant/GeoCroissant JSON-LD document.
record_setYesThe @id of the RecordSet to read (see `list_record_sets` for available ids).
jsonld_pathNoPath to a local Croissant/GeoCroissant file.
jsonld_contentNoRaw JSON string of a Croissant document.

Output Schema

ParametersJSON Schema
NameRequiredDescription
rowsYesThe materialized records.
columnsYesColumn names found across the records.
truncatedYesTrue when more records exist beyond the requested limit.
record_setYesThe RecordSet @id records were read from.
num_recordsYesNumber of records actually returned.

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden and handles it well. It discloses that the tool downloads or resolves FileObjects/FileSets, applies extracts and transforms, may download data for remote distributions, and that inline 'cr:data' rows are returned directly without downloads. It also explains the 'truncated' flag behavior, which is genuinely non-obvious execution context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured and front-loaded with the core function. The Returns section duplicates some information likely provided by the documented output schema, but each section earns its place, and the page's important warning is clearly separated.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description is complete for this tool's complexity: it names the necessary input record_set, describes the materialization pipeline, covers download side effects, directs users to 'list_record_sets' for IDs, and describes the outputs. The presence of an output schema reduces the burden of restating return types, and what the description adds — pipelining, download warnings, truncation — is exactly the contextual content an agent needs.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

All 6 parameters are already documented in the input schema with 100% schema description coverage, so the description does not need to re-explain them. It adds practical parameter guidance for 'limit' ('keep `limit` small on large datasets'), and it indirectly reinforces the 'record_set' parameter via the return description, but it does not add substantial new parameter-level meaning beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: it "Materializes the first records of a RecordSet by executing the data pipeline." It also clarifies that this yields actual data, equivalent to 'Dataset.records(record_set)', and is not just metadata inspection — distinguishing it from sibling tools like list_record_sets.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives concrete use cases: 'preview/sample a dataset's actual data before writing training code' and 'sanity-check that a generated Croissant description produces the expected columns and values.' It does not explicitly name alternative tools to avoid, but it clearly implies this is the data-content tool rather than structure/validation/list tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_structure_graphA

Extracts the internal structure graph of a Croissant document.

    Builds the directed multigraph that ``mlcroissant`` uses internally for
    static analysis: nodes are Metadata / FileObject / FileSet / RecordSet /
    Field objects and edges connect fields to their data sources, record sets
    to their fields, files to archives they are contained in, and referenced
    (foreign-key) fields.

    Usage: Use this tool to reason about dataset lineage and dependencies,
    e.g. "which files feed this field?", "what does this join look like?",
    or to explain a dataset's architecture before writing loading code.

    Returns:
    --------
    StructureGraph containing:
        - nodes: Every node with @id, type, name and parent @id.
        - edges: Directed edges as {source, target} @id pairs.
    
ParametersJSON Schema
NameRequiredDescriptionDefault
jsonld_urlNoURL of a Croissant/GeoCroissant JSON-LD document.
jsonld_pathNoPath to a local Croissant/GeoCroissant file.
jsonld_contentNoRaw JSON string of a Croissant document.

Output Schema

ParametersJSON Schema
NameRequiredDescription
edgesYesDirected edges (source @id -> target @id).
nodesYesGraph nodes with @id, type and parent information.
edge_countYesNumber of edges in the graph.
node_countYesNumber of nodes in the graph.

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full disclosure burden. It clearly explains what graph is built, what nodes and edges represent, and that it's the internal mlcroissant representation. This is sufficient for a read-only analysis tool, though it does not discuss failure modes or source-selection behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured and front-loaded with the core purpose, then detail, usage context, and return information. The Returns section is slightly redundant with the existing output schema, and the text is a bit long for what it conveys; but it earns its place by explaining the graph's internal semantics.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool has no required parameters and an output schema, plus the description fully conveys the returned graph structure and usage context. The main gap is that three possible input sources are not explained as alternatives or prioritized, which is important for a tool that can take a URL, a path, or raw content.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already describes all three parameters (jsonld_url, jsonld_path, jsonld_content) with 100% coverage. The description adds no parameter-specific guidance beyond the schema. It could have clarified that the three inputs are presumably alternative sources and whether exactly one is required, but it is not required at baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Extracts the internal structure graph of a Croissant document.' It further details the node and edge types, which clearly distinguishes this static-analysis/lineage tool from siblings like validate_croissant or get_records_preview.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says when to use the tool: reason about dataset lineage and dependencies, explain architecture before writing loading code, and answers questions like 'which files feed this field?' It provides clear context but does not name alternatives or exclusion conditions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

inspect_geocroissantA

Inspects a Croissant/GeoCroissant document and returns a structured summary.

    Parses the document through the ``mlcroissant`` library (which also acts as
    a strict syntax/schema check - invalid documents are rejected) and returns
    a structured digest: core metadata, GeoCroissant extension properties
    (CRS, resolutions, band configuration, spectral bands, record endpoint...),
    distribution entries (FileObjects/FileSets with URLs, formats, hashes),
    and every RecordSet with its Fields (data types, array shapes,
    source/extract/transform chains).

    Usage: Use this tool to READ and UNDERSTAND a dataset description before
    consuming it, comparing datasets, or planning how to load records.

    Returns:
    --------
    Dictionary containing:
        - name/description/license/version/conformsTo and other core metadata.
        - geospatial: All declared `geocr:` extension properties.
        - distribution: FileObject/FileSet entries.
        - record_sets: RecordSets with nested fields and geo properties.
    
ParametersJSON Schema
NameRequiredDescriptionDefault
jsonld_urlNoURL of a Croissant/GeoCroissant JSON-LD document.
jsonld_pathNoPath to a local Croissant/GeoCroissant file.
jsonld_contentNoRaw JSON string of a Croissant document.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses an important behavioral trait beyond the annotations: it will reject invalid documents via strict syntax/schema check, which is critical for an agent to know. It also details what content will be returned (core metadata, geo extension properties, distributions, record sets, fields, etc.). Since annotations are absent, the description carries the burden, and it does an above-baseline job by describing the validation side effect and return shape, though it could be even richer about error handling and conflicts among the input parameters.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise and well structured with clear sections: the core purpose in the first line, the implementation detail in the next, an explicit 'Usage' block, and a 'Returns' section with a bulleted list. Every sentence earns its place and covers the key behavioral aspects. Front-loading is good: an agent can quickly answer 'What does this do?' and 'When do I call it?'.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description is complete given the tool complexity: an inspection tool with three mutually-exclusive inputs and a rich output that is fully described. It even goes slightly beyond the call by describing the return dictionary structure, which combines well with the output schema already present. The only limitation is param precedence, but that is a minor gap and the overall context is fully sufficient for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% (all three parameters have descriptions: 'URL', 'Path', 'Raw JSON string'), so the baseline is 3. The description itself does not add much insight about parameter precedence or how to choose among the three parameters when multiple are provided, which is a meaningful gap an agent would face. It relies on the schema, which is adequate but not enhanced.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource ('Inspects a Croissant/GeoCroissant document') and distinguishes it from siblings like validate_croissant, create_geocroissant_from_stac, and get_records_preview, which have different purposes. The mention of mlcroissant and 'strict syntax/schema check' and the structured return digest make the scope unmistakable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly names when to use this tool ('to READ and UNDERSTAND a dataset description before consuming it, comparing datasets, or planning how to load records'). It doesn't list exclusions, but the ' 'Usage' sentence plus the sibling context provides clear enough guidance for an agent to select it over the alternative creation/validation/search tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_eo_catalogsA

Lists the Earth observation STAC catalogs registered on this server.

    The registry is data-driven (config/catalogs.yaml): today it contains
    Element84 Earth Search over AWS Open Data
    (https://earth-search.aws.element84.com/v1) with its searchable
    modalities, curated collections and topic keywords.

    Usage: Call once to see where EO data can be discovered from before
    using `search_eo_datasets` / `search_eo_scenes`.

    Returns:
    --------
    Dictionary containing:
        - catalogs: Registered catalogs with id, name, URL, description,
          modalities, common collections and supported topics.
    
ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It explains that the registry is data-driven via config/catalogs.yaml, names the current catalog and contents, and specifies the returned dictionary structure. For a read-only, no-argument list operation, this is strong transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The first sentence states the purpose immediately, and the 'Usage' and 'Returns' sections provide practical, scannable guidance. The listing of catalog contents is slightly redundant with the Returns section but not excessive.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

This is a simple zero-argument tool, and the description covers its trigger, output, and relationship to following search steps. There are no missing details that would prevent an agent from selecting or invoking it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so the description has no parameter semantics to add. The baseline for zero-parameter tools is 4, and the description appropriately focuses on what the output represents instead.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Lists the Earth observation STAC catalogs registered on this server.' It also distinguishes itself from sibling search tools by stating this is the discovery step before using search_eo_datasets / search_eo_scenes.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says 'Call once to see where EO data can be discovered from before using search_eo_datasets / search_eo_scenes.' This gives clear sequencing and routing, making it obvious when this tool should be selected over its siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_record_setsA

Lists the RecordSets of a Croissant/GeoCroissant document.

    A RecordSet is a collection of records (rows/examples) produced by
    applying the declared extraction pipeline to the distribution. This tool
    returns each RecordSet's @id, name, description, key fields, enumeration
    flag, number of inline records/examples and its Fields with their data
    types and source chains.

    Usage: Call this tool to discover what data a dataset exposes and which
    RecordSet names to pass to `get_records_preview`.

    Returns:
    --------
    List of dictionaries, one per RecordSet, each including:
        - @id: The RecordSet identifier used by other tools.
        - fields: Nested field summaries (dataType, isArray/arrayShape,
          source extract/transform chain, geo band properties).
    
ParametersJSON Schema
NameRequiredDescriptionDefault
jsonld_urlNoURL of a Croissant/GeoCroissant JSON-LD document.
jsonld_pathNoPath to a local Croissant/GeoCroissant file.
jsonld_contentNoRaw JSON string of a Croissant document.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the transparency burden. It unambiguously describes a read-only listing operation and enumerates exactly what is returned, including field data types and source chains. There is no misleading mutation or side-effect language; the non-destructive behavior is implicit but clear.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with a clear purpose first, a helpful definition of RecordSet, and an explicit Usage note. There is some redundancy between the earlier sentence enumerating returned fields and the final Returns list, but overall the structure is logical and front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the tool's purpose, output, and relationship to `get_records_preview`, but it does not explain how to provide the input: whether one of `jsonld_url`, `jsonld_path`, or `jsonld_content` is required and whether exactly one should be supplied. Since the tool has three optional-looking inputs, this is a notable gap for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the input parameters are already fully documented. The description adds no extra detail about how to choose between `jsonld_url`, `jsonld_path`, and `jsonld_content`, making this a baseline 3 rather than a higher score.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool lists RecordSets in a Croissant/GeoCroissant document and defines what a RecordSet is. It also distinguishes this tool by noting that it returns high-level dataset structure rather than the actual record data, and explicitly points to `get_records_preview` as the next step.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit usage guidance: call this tool to discover which RecordSet names to pass to `get_records_preview`. It does not contrast against every sibling tool, but it establishes a clear entry point in the workflow and implies this is the discovery/listing step.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_eo_datasetsA

Searches Earth observation DATASETS (STAC collections) by keyword.

    Performs collection-level search on the Earth Search STAC API
    (AWS Open Data). Queries hit the topics map first ('flood' -> Sentinel-1
    + Sentinel-2, 'dem' -> Copernicus DEM...), then fall back to keyword
    matching against live collection metadata; every hit is classified by
    sensor modality (optical / radar / elevation).

    Usage: Start here for dataset-level discovery ("find me flood/burn
    scar/terrain datasets"). Then use the returned collection ids with
    `search_eo_scenes`, or jump straight to `create_geocroissant_from_stac`
    to get GeoCroissant metadata.

    Returns:
    --------
    Dictionary containing:
        - matched_topics: Topic-map hits for the query.
        - count: Number of matching collections found.
        - collections: Matches with catalog, collection id, title,
          description snippet, modality, license and temporal extent.
    
ParametersJSON Schema
NameRequiredDescriptionDefault
queryNoFree-text query. Topics like 'flood', 'wildfire', 'ndvi', 'urban' resolve to curated collections; other words keyword-match collection metadata. Empty lists all.
modalityNoFilter by sensor modality: optical | radar | elevation.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full transparency burden. It discloses the two-stage behavior: 'Queries hit the topics map first ... then fall back to keyword matching against live collection metadata'. It also states that 'every hit is classified by sensor modality' and lists the returned dictionary content, giving the agent a clear moidal picture of what will happen after invoking the tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact, front-loaded with the core behavior, then organized into usage guidance and a return block with no repeated information. Each section earns its place, and code-styled references keep the text scannable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a search-only tool with two optional parameters, an output schema, and clear sibling routing, the description is complete. It states scope, how the query is interpreted, return fields, and recommended follow-up siblings. Missing details such as pagination or error handling are not needed for correct selection and invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema covers the parameters at 100%, so the baseline is 3. The description adds meaningful semantic context beyond the schema: it explains the query flows through a topics map and then keyword matching, and that every result is modality-annotated. This complements the schema's free-text and modality descriptions rather than merely repacing them.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a clear verb and resource: 'Searches Earth observation DATASETS (STAC collections) by keyword' and clarifies it is a 'collection-level search' on the Earth Search STAC API. It also names the sibling operation `search_eo_scenes` and distinguishes dataset-level discovery from scene-level discovery, making this tool's scope unmistakable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly tells the agent when to start here: 'Start here for dataet-level discovery'. It then guides next actions: 'Then use the returned collection ids with search_eo_scenes, or jump staraight to create_geocroissant_from_stac'. This gives clear context for when to use this tool versus its siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_eo_scenesA

Searches satellite SCENES inside a bounding box on Earth Search.

    Executes a real STAC item search (pystac-client) against
    https://earth-search.aws.element84.com/v1 filtered by spatial extent,
    time range and cloud cover. Scenes are the individual acquisitions
    (tiles/granules) that become records of a GeoCroissant dataset.

    Usage: Use after `search_eo_datasets` (or directly with known
    collections) to check actual data availability for an area of interest.
    Feed promising results into `create_geocroissant_from_stac`.

    Returns:
    --------
    Dictionary containing:
        - scene_count and scenes: Per-scene id, collection, acquisition
          datetime, platform, cloud cover, native EPSG and asset keys.
    
ParametersJSON Schema
NameRequiredDescriptionDefault
bboxYesBounding box as [min_lon, min_lat, max_lon, max_lat].
limitNoMax scenes returned (1-50).
modalityNoModality used to pick default collections.
collectionsNoExplicit STAC collection ids. Defaults to curated collections for the chosen modality.
datetime_rangeNoSTAC datetime interval, e.g. "2023-06-01/2023-09-30".
max_cloud_coverNoMaximum eo:cloud_cover percentage for optical scenes (ignored when None).

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden. It transparently states it executes a real STAC item search via pystac-client against the Earth Search endpoint and lists the filtering by spatial, temporal, and cloud-cover criteria. It also summarizes the return payload. It does not fully detail error cases or rate limits, but for a read-only search tool these are minor gaps.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured and efficiently front-loads the purpose, then usage context, and then return format. Each sentence adds value, with no repeated schema details or fluff. The Usage and Returns sections make it easy for an agent to parse.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given an output schema exists and all six parameters are documented in the input schema, this description provides sufficient high-level context. It explains what the tool does, the external service it reads, the intended workflow position, and the fields in the result. Nothing critical for selection or invocation is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. The description adds limited value for parameter semantics but does map the filter concepts (spatial extent, time range, cloud cover) to the overall API behavior and mentions the curated default collections via 'modality'. It doesn't enrich individual parameter fields beyond what the schema already provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the operation ('Searches satellite SCENES inside a bounding box'), identifies the resource ('satellite scenes' vs datasets), and clarifies context by distinguishing them as individual acquisitions. It separates itself from sibling search_eo_datasets and routes to the create_geocroissant_from_stac.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly places the tool in a workflow: 'Use after search_eo_datasets ... to check actual data availability' and 'Feed promising results into create_geocroissant_from_stac'. This tells the agent when to use it and points to the related data availability tool, giving clear when/when-not context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

validate_croissantA

Validates a Croissant or GeoCroissant JSON-LD document.

    Runs the official MLCommons ``mlcroissant`` validator: JSON syntax check,
    JSON-LD expansion, structure-graph construction (FileObjects/FileSets,
    RecordSets, Fields, sources & joins) and full schema conformance checks.

    Usage: Call this tool whenever a dataset description is created or edited,
    BEFORE publishing it, and after any modification of an existing file.
    Works for both plain Croissant documents and documents using the
    GeoCroissant extension (`geocr:` properties).

    Returns:
    --------
    Dictionary containing:
        - valid: True when the document passes validation.
        - errors: Blocking errors reported by the library (empty when valid).
        - warnings: Non-blocking recommendations (e.g. missing license).
        - is_geospatial: Whether GeoCroissant conformance is declared.
        - conforms_to / dataset_name: Extracted metadata when loadable.
    
ParametersJSON Schema
NameRequiredDescriptionDefault
jsonld_urlNoURL of a Croissant/GeoCroissant JSON-LD document.
jsonld_pathNoPath to a local Croissant/GeoCroissant JSON(-LD) file.
jsonld_contentNoRaw JSON string of a Croissant/GeoCroissant document.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations present, the description carries the full behavioral burden and it succeeds: it discloses delegation to the official MLCommons validator, the specific checks performed, support for the GeoCroissant extension, and the exact shape of the returned dictionary including errors vs. warnings. No behavior is hidden.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The structure is logical and front-loaded: purpose, validation steps, usage timing, supported variants, then return values as a bulleted list. It is thorough but not padded; the only minor redundancy is the validation-steps list being slightly over-explained, which prevents a 5.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a validation tool with three well-documented inputs and a documented output dictionary, the description is complete: it covers when to call, what is validated, which document variants are supported, and what will be returned. The provided output schema further reduces the need for the description to explain return values.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 100% description coverage with clear per-parameter explanations for jsonld_url, jsonld_path, and jsonld_content. The tool description adds no additional parameter-level meaning, such as interaction between them or whether exactly one must be provided, so it stays at the high-coverage baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with the specific verb+resource combination 'Validates a Croissant or GeoCroissant JSON-LD document' and enumerates the full validation pipeline (JSON syntax, JSON-LD expansion, structure-graph construction, schema conformance). This clearly distinguishes the tool from the sibling creation, search, and inspection tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit usage triggers: call it whenever the dataset description is created or edited, BEFORE publishing, and after any modification of an existing file. It does not name when-not-to-use cases or explicitly route to an alternative tool, which keeps it short of a full usage-and-exclusion statement.

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.

  1. 12 tool updatesv1.0.0
    • First observedcreate_geocroissant_from_stac
    • First observedcreate_geocroissant_scaffold
    • First observedextract_distribution_urls
    • First observedget_geocroissant_spec_reference
    • First observedget_records_preview
    • First observedget_structure_graph
    • First observedinspect_geocroissant
    • First observedlist_eo_catalogs
    • First observedlist_record_sets
    • First observedsearch_eo_datasets
    • First observedsearch_eo_scenes
    • First observedvalidate_croissant

TDQS

A4.4/5.0

Scored across 12 tools

Disambiguation4/5

The main workflow stages are clearly separated: discovery tools distinguish catalogs, datasets, and scenes, while generation tools differ by their input source. There is some overlap among the inspection tools—inspect_geocroissant already reports RecordSets and distribution entries, making list_record_sets and extract_distribution_urls partially redundant—but the descriptions are detailed enough to guide selection.

Naming Consistency5/5

All tool names follow a consistent snake_case verb_noun pattern: list, search, create, validate, inspect, get, and extract are used predictably. The naming also preserves resource hierarchy clearly, from catalogs to datasets to scenes, which helps agents infer relationships between tools.

Tool Count5/5

Twelve tools is an appropriate size for this domain: a few discovery tools, two generation paths, one validator, and several inspection/preview/extraction utilities. The count supports the full workflow without bloating the surface or feeling thin.

Completeness5/5

The toolset covers the full lifecycle: EO catalog/dataset/scene discovery, GeoCroissant creation from live STAC data or manual parameters, validation, structured inspection, record-set preview, and distribution URL extraction. There are no obvious dead ends because outputs from generation flow naturally into the validation and inspection tools.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    B
    quality
    B
    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
    18
    MIT
  • A
    license
    B
    quality
    D
    maintenance
    Provides tools to search, download, and manage satellite imagery from all Copernicus Sentinel missions via the Copernicus Data Space ecosystem. It enables advanced geospatial queries, temporal coverage analysis, and automated data management for Earth observation tasks.
    13
    7
    LGPL 3.0
  • F
    license
    A
    quality
    D
    maintenance
    Provides 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
    -