Skip to main content
Glama

Server Details

Search, preview, and measure Umbra open SAR from any MCP client. Umbra ships no search API.

If you are the author of this connector, you can claim ownership by verifying the domain or GitHub account it belongs to. Claimed connector authors can inspect health checks, view analytics, and manage their listing.
Status
Healthy
Last Tested
Transport
Streamable HTTP · MCP 2025-11-25
URL
Repository
reesehammer/umbra-py
GitHub Stars
0

TDQS

A4/5.0

Scored across 19 tools

Disambiguation4/5

Most tools occupy clearly distinct niches: search/get_item/download cover catalog access, stack_stats/change_composite/timescan cover measurement, and stamp_* are explicit validation boundaries. The main soft spots are within the image-producing family — change_composite (2-3 passes), timescan (whole series), quicklook and describe_scene all return image blocks and a reader must lean on the wordy descriptions to pick correctly, and find_similar/find_similar_text plus stamp_description/stamp_narration form near-twin pairs separated only by input modality.

Naming Consistency4/5

The dominant pattern is snake_case verb_noun (describe_scene, download_asset, find_repeat_sites, get_item, narrate_change, search_catalog, stamp_description, watch_site), applied consistently across the set. Deviations are minor but visible: noun_verb ordering in change_composite, noun_noun compounds in index_stats and stack_stats/stack_provenance, and uninflected single words quicklook and timescan.

Tool Count4/5

19 tools is on the heavy side for a single archive server, but the domain genuinely spans discovery, retrieval, download handshake, five analysis verbs, provenance checking, interpretation stamping, and standing monitoring, so nearly every tool maps to a distinct workflow step rather than a duplicate. It sits just above the comfortable 3-15 band without feeling padded.

Completeness4/5

The surface covers a full lifecycle: place resolution, metadata/semantic/visual search, item retrieval, size-gated download, site ranking, interval picking, statistical and visual change measurement, provenance pre-flight, grounded narration, and a stateful delta watch that chains back into the analysis verbs. Gaps are minor — there is no way to list or clear existing watch_site watches besides reset, and no tool to export or persist composites/stats outside the conversation.

Available Tools

19 tools
change_compositeA
Read-only
Inspect

Composite 2-3 passes of one site into a change image.

Pass the STAC URLs of two or three acquisitions of the *same* site in time
order. Colors encode change: bright green = signal appeared after the first
date, magenta = signal vanished, grey = unchanged. Refuses to mix
polarizations (HH vs VV are not comparable). Returns the image block plus a
caption naming the color semantics and attribution -- and, when a pass carries
no polarization metadata so same-polarization could not be *verified*, a
structured caution text block naming that gap.
NameRequiredDescriptionDefault
dbNo
urlsYes
assetNoGEC
max_sizeNo

TDQS

A4.7/5.0
Behavior5/5

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

The description goes far beyond the single annotation, detailing the specific color encoding rules, the exact components of the output (image block, caption, caution block), and conditional behavior (the caution text appears when polarization cannot be verified).

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 highly dense, front-loaded with the main function, and efficiently packs technical constraints and output details into coherent sentences.

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 high complexity of the transformation, the description is exhaustive. It explains the input requirements, the internal logic (color encoding), and the exact structure of the output result.

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?

Since schema coverage is 0%, the description should define all parameters. It only provides semantic value for the core 'urls' parameter, failing to define the purpose of 'db', 'asset', or 'max_size'.

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 creates a 'change image' by combining 2-3 passes of a single site, which distinguishes it as a specialized composite generation function.

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?

It provides explicit requirements for proper usage: the STAC URLs must be for the same site and provided in time order. It also gives a critical exclusion regarding polarization.

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

describe_sceneA
Read-only
Inspect

Return a SAR-literate reading of the scene at url.

The picture and the metadata card are produced deterministically; a model
only interprets them. How that model is reached depends on whether this
process holds a vision key:

- **No key** (the public community host): this tool does **not** call a
  vision model. It returns the PNG plus a reading kit (SAR rules, the
  metadata card, the JSON schema). Produce the JSON, then call
  :func:`stamp_description` — that is the validation boundary
  (provenance-stamped ``{summary, observed_features, confidence,
  caveats}``). Until you stamp it, your prose is not pipeline output.
  A baked preview is typically 512 px; the kit names the size and
  that a local server can stream a higher-resolution GeoTIFF.
- **Key configured** (local stdio): sends the picture to that vision
  model, validates through ``parse_description``, and returns the
  stamped object directly.

The packaged SAR rules are the value over just looking at ``quicklook``:
brightness is backscatter not sunlight, speckle is not structure, a dark
patch may be radar shadow not water, one frame is not change.

``preview`` defaults to ``"auto"``: a baked catalog preview if this server
has one, else a fresh render. ``"render"`` is refused on the public host.
NameRequiredDescriptionDefault
dbNo
urlYes
assetNoGEC
modelNo
previewNoauto
max_sizeNo

TDQS

A3.6/5.0
Behavior5/5

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

The description provides critical operational context (two distinct processing modes, refusal of 'render' on public host) that is completely absent from the single readOnlyHint annotation. It explains the underlying methodology (backscatter vs. sunlight) which is vital for SAR data.

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

Conciseness2/5

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

The description is highly verbose and dense, relying on technical jargon (e.g., 'backscatter', 'provenance-stamped') and complex bulleted workflows. This excessive detail makes it difficult for an agent to quickly parse the core utility.

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?

While the tool is complex, the description is highly complete regarding its environmental and processing constraints (e.g., local vs public host). However, it is incomplete for practical invocation because it fails to define the semantics of the majority of its input parameters.

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

Parameters2/5

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

Since schema coverage is 0%, the description bears the burden of explaining its parameters. It offers almost no semantic help for 4 out of 6 parameters (`db`, `asset`, `model`, `max_size`), leaving an AI agent guessing their function.

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

Purpose3/5

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

The description clearly identifies the core purpose: returning a SAR-literate reading of a scene at a given URL. However, it spends significant effort on implementation details (vision keys, model vs. no key) rather than simply stating the function of the tool.

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 is exceptionally clear about operational requirements, distinguishing between 'No key' and 'Key configured' modes. It explicitly dictates the necessary workflow (calling :func:`stamp_description`) and explains the value proposition over sibling tools like quicklook.

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

download_assetAInspect

Download one asset of an item to local disk, gated by a size check.

SAR products can be multiple GB, so this is a two-step handshake: call it
first with ``confirm=False`` (the default) to get the byte size without
downloading, then again with ``confirm=True`` to actually fetch. Returns
``{asset, path, bytes}`` on download, or a size-and-hint object when
confirmation is still required.

On a public host (``umbra serve --public``, COG streaming off),
``confirm=True`` is refused. The error includes the asset href and its
size in bytes and tells you to download the file locally (or run a local
``uvx --from 'umbra-py[mcp]' umbra-mcp`` server for ``download_asset``).
``confirm=False`` still returns the size.

``url`` is a STAC JSON URL, or a product filename
(``2025-05-17-17-43-46_UMBRA-08_GEC.tif``) or acquisition stem
(``2025-05-17-17-43-46_UMBRA-08``). A filename or stem is resolved through
the catalog index the same way as ``get_item``. The hosted server already
has that index. A local server needs ``umbra index fetch``.

``asset`` selects the file. All of these work:

- a product type, any case: ``GEC``, ``gec``, ``SICD``
- a schema v2 key, including a collision suffix: ``gec``, ``gec_2``,
  ``csi``, ``sidd``, ``csi_sidd``, ``sicd``, ``cphd``, ``metadata``,
  ``stac_metadata``, ``di_gif``, ``file``, ``file_tif``
- the original filename (the asset's ``umbra-py:filename``)

``GEC`` and ``gec`` are the primary file. ``gec_2`` is the second GEC,
not the primary. A name that matches nothing raises with the item's v2
keys listed (``gec, sicd, cphd``, …), not the uppercase product types.
NameRequiredDescriptionDefault
urlYes
assetNoGEC
confirmNo
dest_dirNo.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.7/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 burden and does so: it discloses return shape ({asset, path, bytes} vs size-and-hint), the public-host refusal and its error contents, the index requirement for local servers, and that unmatched asset names raise while listing v2 keys.

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?

Front-loaded with the two-step handshake, which is the most decision-critical fact. The asset-form enumeration is long but justified at 0% schema coverage; a few passages (e.g. repeated public-host detail) could be trimmed without loss.

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?

An output schema exists, yet the description still usefully previews return values. Behavior, prerequisites, and error paths are complete; the only missing piece an agent needs is guidance on dest_dir.

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?

Schema coverage is 0%, so the description must compensate. It thoroughly documents url (STAC URL, filename, or stem with index resolution), asset (product types, v2 keys with collision suffixes, filenames, and the gec vs gec_2 distinction), and confirm semantics. dest_dir is left completely undocumented, leaving one gap.

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?

States a specific verb and resource ('Download one asset of an item to local disk') plus the size-check gating constraint. It distinguishes itself from siblings by referencing get_item-style resolution and the local/hosted server distinction.

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 prescribes a two-step workflow: call with confirm=False to get size, then confirm=True to fetch. It also states the when-not case (public host refuses confirm=True) and the alternative remedy (download locally or run a local umbra-mcp server).

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

find_repeat_sitesA
Read-only
Inspect

Rank the archive's most repeat-imaged sites — where change detection has something to measure.

The discovery step *before* every analysis verb. ``change`` / ``timescan`` /
``stack`` / ``pick_change_interval`` / ``narrate_change`` all answer *what*
changed at a site, but each assumes the caller already knows *which* site to
point them at. Umbra files every pass of an area under one task (site), so a
site's coverage is just how many dated passes share its task; the sites with
the most are exactly the ones where a time series exists to analyse. This
tool ranks them, so ``find_repeat_sites → pick_change_interval →
narrate_change`` is a complete chain a model can drive with no site known in
advance — the deterministic answer to "where is there something to look at?"
(the discovery moat; no model is called). Reach for this
(or ``search_catalog(area=..., fuzzy=True)``) before ``semantic=True`` when
the site name is roughly known.

The filters scope the *pool* of acquisitions the ranking is computed over,
and are the same ones ``search_catalog`` takes: ``bbox``
(``[min_lon, min_lat, max_lon, max_lat]`` WGS84), ``intersects`` (a GeoJSON
polygon, mutually exclusive with ``bbox`` / ``place``), ``place`` (free-text,
geocoded to a bbox), ``area`` (a task-name substring, loosened by ``fuzzy``),
``start`` / ``end`` date bounds, ``products`` (GEC / SICD / SIDD / CPHD), and
the SAR property filters ``polarizations`` / ``min_incidence`` /
``max_incidence`` / ``max_resolution``. ``top`` caps how many sites are
returned, and ``min_passes`` is how many passes a site needs to qualify (2 is
the minimum a change composite can use; raise it to find only deeply-revisited
series), counted on the depth ``rank_by`` measures -- raw dated passes by
default, the usable (comparable) series' depth under ``rank_by="comparable"``.

``rank_by`` chooses the order: ``"passes"`` (the default) ranks by raw pass
count; ``"comparable"`` ranks by *analysable* depth instead -- the
``comparable_passes`` largest same-polarization dated subset a change verb can
actually difference -- so a deep single-polarization series is not outranked by
a broader mixed-polarization site whose passes no analysis verb can compare, and
``min_passes`` then floors that same usable depth, so ``rank_by="comparable",
min_passes=3`` returns only sites whose differenceable series is at least three
passes deep. The two agree when every dated pass of every site shares one
polarization; prefer ``"comparable"`` when the next step is
``pick_change_interval`` / ``stack_stats``, which consume exactly that
differenceable subset. Three *temporal* orders rank on the axes the filters below
select on: ``"recency"`` orders by each site's newest dated pass (the
still-active site to monitor or task, which a depth order buries under a deeper
but dormant series), ``"span"`` by each site's observation baseline (the site
watched long enough for slow change to show), and ``"cadence"`` by each site's
*typical* revisit gap, tightest first (the most-frequently-imaged site -- the
median gap, not the worst one, so a single outage does not bury an otherwise
reliably-imaged series; the worst-case reading stays the ``max_revisit_days``
filter). ``min_passes`` still qualifies a site on raw depth under any of the
three, so a temporal order returns only sites with a series worth ordering.

``active_since`` keeps only sites still imaged *on or after* that date -- a
recency filter on each site's newest pass, so a deep series that stopped long
ago is dropped and an actively-revisited one is kept. Use it to find live
monitoring targets ("repeat-imaged sites still being collected"). It accepts an
ISO date (``"2024-06-01"``), a bare year/month, or a relative expression
(``"6 months ago"``), is orthogonal to ``rank_by`` / ``min_passes`` (it gates on
the site's latest pass, whatever depth the ranking measures), and differs from
``start`` / ``end``: those bound which *passes* enter the pool (truncating every
series to a window), whereas this selects whole sites by recency and keeps each
survivor's full history.

``active_before`` is the complement -- keep only sites whose newest pass is *on
or before* that date (a dormant series that stopped imaging). Pass both to select
sites whose latest pass falls *within* a window (``active_since <= last <=
active_before``). Same grammar as ``active_since``, but a bare year/month covers
the whole named period (``active_before="2024"`` is "last imaged on or before
2024-12-31"), symmetric with ``end``.

``first_since`` / ``first_before`` are the onset (first-seen) twins of the
``active_*`` pair -- they gate each site's *earliest* pass rather than its newest.
``first_since`` keeps **newly-appeared** series (first imaged on or after the date --
ones that entered the archive recently) and ``first_before`` keeps
**long-established** ones (first imaged on or before it -- watched since before
then); pass both to bound the onset to a window
(``first_since <= first <= first_before``), exactly as the ``active_*`` pair bounds
the newest pass. Same grammar as ``active_since``, ``first_before`` snapping a bare
year/month to its last day. Orthogonal to the ``active_*`` recency filters, since
when a site started and whether it is still going are independent axes -- so
``first_since=X, active_before=Y`` finds series that appeared after X and have
already gone dormant by Y. ``None`` (the default) applies no onset filter.

``max_revisit_days`` keeps only sites revisited *at least this often* -- a cadence
filter on each site's **worst-case** revisit gap (in days), so a series with any
stretch longer than that between consecutive passes is dropped and a reliably
imaged one kept. Use it to find monitorable targets ("repeat-imaged sites with no
blind spot longer than N days"). It gates the cadence ``rank_by`` measures -- the
whole dated series by default, the usable (comparable) series' worst gap under
``rank_by="comparable"`` -- is orthogonal to ``active_since`` / ``active_before``,
and drops a site with fewer than two passes in the gated series. A non-positive
value is a ``ValueError``.

``median_revisit_days`` is the *typical*-cadence twin of ``max_revisit_days`` --
keep only sites whose **median** revisit gap (in days) is at most that, so a site
*usually* imaged often is kept even if a single stretch runs long, where
``max_revisit_days`` drops it the moment any gap exceeds the bound. Use it for
"usually imaged frequently" rather than "never blind for longer than N days"; set
both to combine the two. It gates the cadence ``rank_by`` measures (the usable
series' typical gap under ``rank_by="comparable"``), is orthogonal to
``max_revisit_days`` and the recency filters, and drops a site with fewer than two
passes in the gated series. A non-positive value is a ``ValueError``.

``min_span_days`` keeps only sites imaged over *at least this long* -- a baseline
filter on each site's observation **span** (in days, first pass to last), so a
series confined to a short window is dropped and a long-baseline one kept. Use it
to find targets for *slow* change (subsidence, construction, deforestation) that
needs a long observation window to be visible. It is a different axis from
``max_revisit_days``: cadence is the worst *gap* (how reliably a site is watched),
span is the total *baseline* (how long it has been watched at all). It gates the
span ``rank_by`` measures -- the whole dated series by default, the usable
(comparable) series' span under ``rank_by="comparable"`` -- is orthogonal to
``active_since`` / ``active_before`` / ``max_revisit_days``, and drops a site with
fewer than two passes in the gated series. A non-positive value is a ``ValueError``.

``max_span_days`` is the upper twin of ``min_span_days`` -- keep only sites imaged
over *at most this long* (a short-lived series, a burst of imaging now over), the
complement of the floor. Set with ``min_span_days`` the two bound each site's
baseline to a window (``min_span_days <= span <= max_span_days``), exactly as
``active_since`` / ``active_before`` bound the newest pass to one. It gates the same
span ``rank_by`` measures (the usable series under ``rank_by="comparable"``) and,
like the floor, drops a site with no measurable span so the window admits only a
confirmed baseline. A non-positive value is a ``ValueError``.

``limit`` sizes the *live/token* pool only. On the local index a site's depth
is measured **whole-archive** — one ``GROUP BY task`` over the entire index
(:meth:`CatalogIndex.rank_sites`), so a deeply-imaged site is ranked by all
its passes rather than by whatever the first ``limit`` rows admitted, and
``limit`` does not apply. On the live open bucket or the Canopy archive there
is no index to group over, so ``limit`` sizes the single re-listed pool the
ranking is computed from (bigger finds more sites and deeper series but scans
more of the archive; ``area`` narrows it instead).

Returns ``sites``, best-covered first: each a ``SiteCoverage`` with the site's
``task`` codename and place ``label``, its ``passes`` count, ``first`` /
``last`` dates and ``span_days``, ``min_revisit_days`` / ``median_revisit_days``
/ ``max_revisit_days`` cadence (the last being the longest gap, i.e. the site's
worst-case temporal resolution) with ``comparable_min_revisit_days`` /
``comparable_median_revisit_days`` / ``comparable_max_revisit_days`` the same
shortest / typical / worst triple over just the differenceable subset (each can
diverge from its raw twin when a cross-polarization pass fills a gap the
analysis verbs cannot use), union ``bbox`` footprint, ``products`` and
``polarizations`` — with ``comparable_polarizations`` naming *which* single
polarization the usable series is (the signature the ``comparable_*`` figures
are all measured over, a strict subset of ``polarizations`` when the site is
mixed) — and the
``hrefs`` — the site's pass STAC URLs, **oldest-first**, ready to hand straight
to ``pick_change_interval`` (or ``change_composite`` / ``stack_stats``). Also
``count`` (sites returned), the pool ``source``, the resolved
``place`` / ``bbox`` / ``area``, a ``query`` echo of the ranking-and-selection
inputs (``rank_by``, ``top``, ``min_passes`` and the recency / onset / cadence /
baseline bounds, as you passed them) so the answer records how it was ranked and
filtered, and the attribution line.

``local`` selects the backend exactly as ``search_catalog`` does — unset uses
the on-disk index when present (instant) and a live S3 walk otherwise. With a
Canopy token configured (``$UMBRA_CANOPY_TOKEN``) the pool is drawn from the
commercial archive instead. The ranking is single-sourced with the static
showcase's featured-gallery selector, so this and ``umbra sites`` cannot
disagree about what "most repeat-imaged" means.
NameRequiredDescriptionDefault
endNo
topNo
areaNo
bboxNo
fuzzyNo
limitNo
localNo
placeNo
startNo
rank_byNopasses
productsNo
intersectsNo
min_passesNo
first_sinceNo
active_sinceNo
first_beforeNo
active_beforeNo
max_incidenceNo
max_span_daysNo
min_incidenceNo
min_span_daysNo
polarizationsNo
max_resolutionNo
max_revisit_daysNo
median_revisit_daysNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

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

Annotations only declare readOnlyHint, so the description carries most of the burden and does: backend selection (`local` unset → on-disk index vs live S3 walk, Canopy token), that no model is called, that `limit` is ignored on the local whole-archive GROUP BY path, that sub-two-pass sites are dropped by cadence/span gates, and that non-positive values raise ValueError. It even documents output field semantics and href ordering.

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

Conciseness2/5

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

The purpose and usage routing are front-loaded, but the body is roughly 1,500 words of dense prose with heavy backtick formatting and repeated framing ("orthogonal to", "is the twin of", "It gates the ... `rank_by` measures") restated for nearly every filter. The `rank_by` paragraph alone runs several hundred words; a parameter table or three-line-per-param pattern would convey the same semantics in a fraction of the 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?

For a 25-parameter discovery tool with an output schema, this covers selection, ranking, backend differences, filter interactions that are non-obvious (pool-scoping `start`/`end` vs whole-site `active_*`), failure modes, and what the return payload contains. Nothing an agent needs in order to call it correctly is left implicit.

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

Parameters5/5

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

Schema coverage is 0% across 25 parameters, and the description compensates thoroughly — dates accept ISO, bare year/month, or relative expressions; `bbox` is `[min_lon, min_lat, max_lon, max_lat]` WGS84; `intersects` is mutually exclusive with `bbox`/`place`; `rank_by` values are enumerated with the exact axis each ranks on. It also explains how paired bounds compose (`active_since` + `active_before`, `min_span_days` + `max_span_days`).

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?

Opens with a specific verb and resource: "Rank the archive's most repeat-imaged sites," and immediately frames its role as the discovery step before `change` / `timescan` / `stack` / `pick_change_interval` / `narrate_change`. It also distinguishes itself from `search_catalog(area=..., fuzzy=True)` so an agent can pick between them without reading schemas.

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?

States explicitly when to reach for it ("the discovery step *before* every analysis verb", no site known in advance) and names alternatives with the condition that selects them (`search_catalog` with `fuzzy=True` when the site name is roughly known, before trying `semantic=True`). It also gives concrete filter recipes tied to intents (live monitoring targets, slow-change targets, newly-appeared vs long-established sites).

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

find_similarA
Read-only
Inspect

Find archived scenes that look like the acquisition at url.

This is the one search that lives in the pixels, not the metadata: where
``search_catalog`` filters by date/bbox/task-name, this renders the query
item's quicklook, embeds it, and ranks the pre-embedded scene index by visual
(cosine) similarity — "find scenes that look like this flooded field / crowded
berth / runway". The query item is excluded from its own results.

Requires a scene-embedding index built ahead of time with ``umbra embed
build`` (a sidecar ``catalog.embed.db`` beside the catalog index) and a
user-supplied multimodal embedding key (``OPENAI_API_KEY``, optionally
``OPENAI_BASE_URL`` / ``UMBRA_SCENE_EMBED_MODEL``) — the only model call is
turning the query image into a vector; ranking is deterministic. ``asset``
picks which product's quicklook to embed (default ``GEC``; match how the index
was built); ``model`` must match the index's embedding model. Returns the
ranked matches as compact records (each with the acquisition's ``href``, so
hand it to ``get_item`` / ``quicklook`` / ``change_composite`` next) plus the
attribution line.
NameRequiredDescriptionDefault
urlYes
assetNoGEC
modelNo
top_kNo
min_scoreNo

Output 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?

The description is highly transparent about operational requirements, detailing the need for a pre-built scene-embedding index, required API keys, and the deterministic nature of the ranking process (cosine similarity). This adds massive context beyond the simple 'readOnlyHint: true' annotation.

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?

While highly detailed, the initial paragraphs define the scope concisely and front-load the purpose. The subsequent technical explanation is dense and long, but the length is necessitated by the complexity of the underlying workflow (embedding index dependencies).

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 maximally complete definition for a complex, data-intensive tool. It outlines prerequisites (index build), operational constraints (API keys), and specifies the utility of the output data (use href with 'get_item'/'quicklook').

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

Parameters5/5

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

Since schema coverage is 0%, the description must carry the full burden. It successfully adds semantics to all key parameters, explaining what 'asset' refers to (product quicklook source), what 'model' must match (the index embedding model), and the purpose of 'top_k' (ranked matches).

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 provides an extremely clear purpose: to find archived scenes that 'look like' a specific URL acquisition. It clearly defines the scope as visual, contrasting it sharply with metadata searches like those performed by 'search_catalog'.

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?

It provides explicit guidance on when to use this tool versus alternatives. It contrasts its visual, embedding-based ranking mechanism against the metadata filtering of 'search_catalog,' leaving no ambiguity for the agent.

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

find_similar_textA
Read-only
Inspect

Find archived scenes matching a plain-language query over their imagery.

Text-to-scene search: embeds ``query`` ("ships at a berth", "a flooded field")
and ranks the stored *image* vectors by cosine similarity. It only works when
the index was built and this query is embedded with the **same** joint
CLIP-family model whose text and image encoders share a vector space (a
dimension mismatch is reported as an error; ``model`` selects it).

Requires the same prebuilt ``catalog.embed.db`` (``umbra embed build``) and
embedding key as ``find_similar``; the only model call is turning the text
query into a vector. Returns the ranked matches as compact records (each with
the acquisition's ``href`` for ``get_item`` / ``quicklook``) plus attribution.
NameRequiredDescriptionDefault
modelNo
queryYes
top_kNo
min_scoreNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior4/5

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

readOnlyHint=true is consistent with a pure retrieval tool, and the description adds real context beyond annotations: index/key requirements, model-match failure mode, and that the sole model call is text embedding. It also discloses the return shape (compact records with href usable by get_item/quicklook, plus attribution), though it doesn't mention pagination or result limits.

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?

Front-loaded with purpose and mechanism, then prerequisites, then return shape — a logical order with little waste. The heavy markup (double backticks, bold) and some redundancy around the embed database make it slightly longer than necessary.

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?

Covers purpose, prerequisites, failure mode, and hand-off to get_item/quicklook; an output schema exists so return values needn't be spelled out. The gaps are the two undescribed tuning parameters, which matter for controlling result volume and similarity threshold.

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 0%, so the description must carry parameter meaning. It does well for `query` (plain-language examples like 'ships at a berth') and `model` (must match the joint CLIP model used at index time), but `top_k` and `min_score` are never mentioned — notably that min_score is a cosine-similarity threshold, which is not inferable from the name alone.

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?

States a specific verb+resource ('find archived scenes matching a plain-language query over their imagery') and names the mechanism (text-to-scene CLIP embedding search). It explicitly contrasts with the sibling find_similar by noting the only model call here is text-to-vector, so an agent can distinguish the two without opening schemas.

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?

Gives clear prerequisites: the index must be built via `umbra embed build` and the query must use the same joint CLIP-family model as the index, with dimension mismatch surfaced as an error. It implies the alternative (find_similar for image queries) but never states when *not* to use it or how it compares to search_catalog for metadata filtering.

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

geocode_placeA
Read-only
Inspect

Resolve a free-text place name to a bounding box via Nominatim.

Returns ``{"bbox": [min_lon, min_lat, max_lon, max_lat], "display_name":
...}`` so the agent can inspect the box before searching, or pass it
straight to ``search_catalog``'s ``bbox``.
NameRequiredDescriptionDefault
queryYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

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

The readOnlyHint annotation already establishes the safety profile, and the description adds meaningful context by identifying Nominatim as the external service and documenting the returned bbox/display_name structure. It does not discuss rate limits, ambiguity handling, or error behavior, but it adds real behavioral detail beyond the annotation.

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

Conciseness5/5

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

The description is two sentences, front-loaded with the core purpose and followed by the return shape and usage. Every sentence earns its place and there is no redundant text.

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 simple one-parameter geocoding tool with an output schema and read-only annotation, the description covers purpose, output shape, and sibling integration adequately. Minor gaps remain around no-match behavior and result ambiguity, but nothing essential is missing for correct 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?

Schema description coverage is 0%, so the description must carry the semantic burden for the single required parameter. It does this by describing query as a free-text place name, which is more informative than the bare schema field name, though it does not give examples or format constraints.

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: resolve a free-text place name to a bounding box. It names the underlying service (Nominatim) and clarifies the exact output shape, making the tool easily distinguishable from catalog search or scene 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?

It explains the intended workflow: inspect the returned box before searching, or pass it directly to search_catalog's bbox. This gives clear usage context and names the relevant sibling, though it does not explicitly state exclusions or failure cases.

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

get_itemA
Read-only
Inspect

Return the full context card for one item.

``url`` is the JSON URL of an open-data STAC sidecar, a GEC/SICD (or other
product) filename such as ``2025-05-17-17-43-46_UMBRA-08_GEC.tif``, or the
acquisition stem ``2025-05-17-17-43-46_UMBRA-08``. A filename or stem is
resolved through the local catalog index: the stem is matched against
asset hrefs, which is what distinguishes ``sar-data/tasks/``,
``sar-data/task-data/``, and ``open-data/`` — the name itself does not.
Zero matches is an error. More than one match lists the candidate STAC
URLs; pass one of those. The hosted server resolves a filename or stem
with the catalog index it already loaded. A local server does the same
after ``umbra index fetch``.

When the index contains a STAC URL, the indexed snapshot is returned —
the same document ``search_catalog`` already answered from — rather than
a live re-fetch that can disagree on asset filenames or product types.
When the server is configured with a token (``$UMBRA_CANOPY_TOKEN``) and
``url`` is a bare acquisition id (no ``://``, and not a filename or stem),
it is instead looked up in Umbra's authenticated commercial archive by a
keyed STAC search — the retrieval complement to ``search_catalog`` over
the paid catalog, since archive cards carry an ``id`` (not a fetchable
sidecar URL) as their hand-off pointer. A filename or stem still resolves
from the local open-data index when a token is set.

The card (:meth:`UmbraItem.to_llm_context`) carries the id, ISO datetime,
place, bbox, resolution, polarization *with the change-detection caveat*,
the per-product-type explanations and asset URLs, and the mandatory
attribution line — everything a model needs to reason about the scene.
NameRequiredDescriptionDefault
urlYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior5/5

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

There is no contradiction with readOnlyHint=true. The description goes well beyond annotations: it discloses that zero matches is an error, multiple matches return candidate STAC URLs to re-pass, indexed snapshots are preferred over live re-fetch to avoid asset-name disagreement, and a token enables a commercial-archive lookup by keyed search.

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?

Core purpose is front-loaded in one line before the resolution rules, and nearly every sentence adds operational information. It is nonetheless long and partially repetitive — the rule that filenames/stems still resolve from the local index when a token is set restates earlier resolution logic.

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 one-parameter tool with an output schema, this is more than sufficient: it covers input forms, deployment differences, failure modes, and the retrieval-on-demand role relative to ``search_catalog``. The card contents are also summarized despite the output schema already existing.

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

Parameters5/5

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

Schema coverage is 0% and the single ``url`` parameter has no description at all in the schema, so the description carries the full burden — and it does, enumerating the three accepted forms, the resolution mechanism (stem matched against asset hrefs), the token-gated commercial path, and error/candidate behavior.

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

Purpose4/5

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

The opening sentence states a specific verb and resource: 'Return the full context card for one item.' The body distinguishes its retrieval semantics from ``search_catalog`` (indexed snapshot vs. live re-fetch) and from other catalog tools, though that differentiation is embedded in detail rather than stated crisply.

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?

It explains exactly which inputs are accepted and how each resolves — sidecar JSON URL, product filename, acquisition stem, or bare acquisition id under a token — and notes the ``umbra index fetch`` prerequisite for local servers. It is called 'the retrieval complement to ``search_catalog``', which implies the follow-up use case, but never states an explicit 'use this after a catalog hit / do not use for searching' rule.

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

index_statsA
Read-only
Inspect

Report on the local catalog index, if one has been built or fetched.

Lets a long-running agent decide whether searches will be instant (index
present) or pay a live S3 walk, and how stale the snapshot is. ``end`` is
the newest acquisition that is not ``datetime_suspect``.
``datetime_suspect_count`` is how many kept rows carry that flag.
``quarantined_future_count`` is how many source rows the last build
dropped for a datetime more than a day ahead (they are not in the index).
``unique_captures`` is how many rows are the canonical copy of their
collect; it equals ``items`` until republished copies have been linked.
NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior5/5

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

Beyond the readOnlyHint annotation, the description discloses important behavioral context: the index may or may not exist, searches become live S3 walks without it, and it explains staleness and several field meanings including datetime_suspect, quarantined_future_count, and unique_captures. This is substantive context that helps an agent interpret the tool's output and trade-offs.

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 front-loaded with the core purpose and then adds useful field semantics. It is somewhat long because it explains return fields that may already be documented in the output schema, but every sentence remains informative and there is no filler.

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 zero parameters, a readOnly annotation, and an output schema, the description provides everything an agent needs: what the tool reports, why to use it, and how to interpret key fields. No critical context appears to be missing.

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 baseline is 4. The description correctly does not invent parameter details, and the input schema is empty and fully covered.

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

Purpose4/5

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

The description clearly states a specific verb and resource: 'Report on the local catalog index'. It also explains what the report is for, but does not explicitly contrast the tool with the sibling search_catalog or other stats tools, so it falls short of full sibling differentiation.

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?

It gives a clear usage context: 'Lets a long-running agent decide whether searches will be instant (index present) or pay a live S3 walk, and how stale the snapshot is.' This tells the agent when the tool is valuable, but does not name an alternative tool or state when not to use it.

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

narrate_changeA
Read-only
Inspect

Return a grounded reading of what changed between passes.

Sibling of :func:`describe_scene`. The composite and the per-block dB grid
are produced deterministically; a model only narrates change those numbers
support. Pass the STAC URLs in time order; mixed polarizations are refused.

This tool **streams Umbra COGs** to build the composite, so a public
community host refuses it (use a local ``uvx --from 'umbra-py[mcp]'
umbra-mcp`` server, or describe each pass with :func:`describe_scene` /
:func:`quicklook` on baked previews). On a local server:

- **No vision key:** returns the composite as an MCP image block plus a
  reading kit (SAR change primer, the dB grid, the JSON schema). **You**
  (the client's model) narrate, grounded in the numbers.
- **Key configured:** sends picture + grid to that vision model, validates
  through ``parse_narration``, and returns a provenance-stamped
  ``{summary, changes[], confidence, caveats[], change_stats}`` object.
NameRequiredDescriptionDefault
dbNo
urlsYes
assetNoGEC
modelNo
max_sizeNo

TDQS

A4.9/5.0
Behavior5/5

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

The description goes far beyond the single annotation (`readOnlyHint: true`) by detailing complex behavioral traits. It outlines that the tool streams Umbra COGs, requires specific server environments, and conditionally returns two entirely different payload structures based on the presence of a vision key.

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?

While highly technical and dense, the information is logically structured. It flows from core purpose to specific constraints and then to operational modes (public vs. local). The density is justified by the complexity of the tool itself.

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 definition is exceptionally complete for such a complex tool. It covers input prerequisites (STAC format, order, polarization), execution environment constraints, and the two distinct output schemas (raw kit vs. provenance object), leaving no ambiguity about its function or use.

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

Parameters5/5

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

Given that schema description coverage is 0%, the description is highly effective. It provides the necessary context for the `urls` parameter (STAC URLs, must be in time order), and sets expectations for the results, which informs how the agent should interpret the context of the input fields.

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 purpose is clearly stated in the first sentence: 'Return a grounded reading of what changed between passes.' It immediately distinguishes itself as a sibling of 'describe_scene,' defining its unique function as narrating change based on deterministic data, which is critical for differentiation.

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 provides stringent operational guidelines, including a refusal of mixed polarizations and a detailed breakdown of required setups (public vs. local hosting). It dictates precisely how inputs must be ordered (time order) and when to expect specific output formats.

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

pick_change_intervalA
Read-only
Inspect

Scan a site's whole series and name the two passes worth narrating.

The deterministic first half of the "watch a site over time" story, and the
step that turns a wall of passes into an answer. Given the STAC URLs of a
site's passes (2 or more, any order), it co-registers them into a
``to_stack`` cube, reduces it with ``stack_stats``, and returns the *one*
consecutive pass-pair whose measured change stands **furthest clear of the
speckle detection floor** — the pair a reader should look at first. No model
is called: a number picks the frames (the determinism boundary applied to
frame selection), so the choice is reproducible and safe
to quote.

Why this exists as its own tool: ``narrate_change`` reads a *pair* of passes,
but a site has many, and "which two?" is a measurement question, not a model
one — a picture past three dates encodes nothing a model can separate, so the
pair has to be chosen before the model is called. This answers it. The
returned ``urls`` are the two chosen passes in time order, ready to hand
straight to ``narrate_change`` (or ``change_composite`` to see them): the
two tools chain into scan → narrate with no server and no model in the
selection.

Returns ``selected_interval`` (the interval's ``earlier_id`` / ``later_id``,
their datetimes, the ``changed_fraction`` and signed ``mean_delta_db``, the
cube's ``false_alarm_fraction`` speckle floor, the ``excess`` of the change
over that floor, and ``stands_clear`` — whether the change cleared the floor
by a usable margin), ``urls`` (the earlier then the later pass's STAC URL),
and the license/attribution. When ``stands_clear`` is false the series' own
largest change is still inside the speckle, so the pair is offered but the
reader is warned the difference may be interference rather than change.

``selected_interval`` is ``None`` (and ``urls`` empty) when the series has
fewer than two comparable passes or no interval reported any change — there
is no pair to narrate. ``crs="utm"`` (the default) grids the cube in the
site's UTM zone so the change fractions weigh equal ground; ``max_size`` and
``change_threshold_db`` match ``stack_stats``. Refuses to mix polarizations
(HH vs VV are not comparable). Requires the ``load`` extra.
NameRequiredDescriptionDefault
crsNoutm
urlsYes
assetNoGEC
extentNointersection
max_sizeNo
change_threshold_dbNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

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

This description is remarkably transparent. It explains the underlying mechanics (co-registers into a 'to_stack' cube, reduces with 'stack_stats'), defines the criteria for success (furthest clear of the speckle floor), and handles failure modes (returning 'None' if insufficient data exists).

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?

While the description is quite lengthy, its detailed nature is justified by the technical complexity of the algorithm. Every sentence serves to explain a critical constraint or purpose, meaning there is zero wasted information.

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 tool is comprehensively defined. It covers input constraints (required `load` extra, no mixing polarizations), output behavior (what the returned fields mean), logical termination conditions, and its role in the overall data analysis architecture.

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?

Given the 0% schema description coverage, the description is vital. It explains the semantic constraints of the parameters, such as why 'crs' is used (to weigh equal ground) and that 'max_size' and 'change_threshold_db' must align with 'stack_stats'.

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 purpose is stated with surgical precision: it scans a whole series and names the *pair* of passes with the greatest measurable change. It explicitly differentiates itself from narrating tools by defining its role as a measurement and selection step, not a modeling one.

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 provides a complete workflow explanation, detailing why this tool is necessary before calling `narrate_change` or `change_composite`. It defines the 'before and after' use case, ensuring the agent understands its placement in the analytical pipeline.

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

quicklookA
Read-only
Inspect

Return a scene's quicklook PNG as an image block.

Prefers a baked catalog preview (``preview="auto"``, the default) so a
public host can show the radar scene without proxying Umbra COGs.
**A baked preview is typically 512 px** (the published weekly sidecar).
``max_size`` applies only to a fresh ``preview="render"`` stream; when a
cached thumbnail is smaller than requested, the caption says
``max_size`` was ignored *and* includes a JSON
``{"image": {source, width, height, requested_max_size, substituted}}``
sidecar. For a higher-resolution picture (typically 1024 px), run a
local ``uvx --from 'umbra-py[mcp]' umbra-mcp`` server, or download the
GEC href from ``get_item``. ``preview="baked"`` refuses rather than
stream; ``preview="render"`` always streams (needs ``[viz]``, refused
on ``umbra serve --public``).
NameRequiredDescriptionDefault
dbNo
urlYes
assetNoGEC
previewNoauto
max_sizeNo

TDQS

A4.9/5.0
Behavior5/5

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

Since annotations are minimal (`readOnlyHint: true`), the description bears the full burden and excels. It explains critical operational behaviors like caching (that `max_size` is ignored when a cached thumbnail is smaller) and the generation of JSON sidecars.

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?

While the description is lengthy, its complexity (caching, rendering modes, environment dependencies) necessitates the detail. The most critical information—the purpose and default behavior—is placed upfront.

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 definition is highly complete. It outlines the return type, operational limits (refusal vs. streaming), resolution behavior, and external requirements for high resolution (e.g., local server/`get_item`), leaving no major functional gaps for the agent.

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

Parameters5/5

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

With 0% schema description coverage, the description provides vital semantic context for each parameter. It explains the functional meaning of `preview` (baked, render) and how `max_size` interacts with the caching mechanism, adding significant meaning beyond simple schema typing.

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 identifies the resource ('a scene's quicklook PNG') and the action ('Return'). It differentiates itself from general asset retrieval by specifying the format (PNG image block) and the underlying logic of the 'quicklook' function.

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?

It provides specific usage constraints, explaining that baked previews prefer `preview="auto"` and detail the conditional behaviors of `preview="baked"` (refuses) versus `preview="render"` (streams, requires [viz]). This tells the agent exactly when different modes are viable.

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

search_catalogA
Read-only
Inspect

Search Umbra's catalog and return compact context cards.

Filters (all optional, combine freely): ``bbox`` as
``[min_lon, min_lat, max_lon, max_lat]`` in WGS84 degrees; ``intersects`` as
a GeoJSON polygon object (a ``Polygon`` / ``MultiPolygon`` geometry, or a
``Feature`` / ``FeatureCollection`` wrapping one) to keep only footprints
intersecting it -- a tighter spatial filter than the rectangular ``bbox``,
and mutually exclusive with ``bbox`` / ``place``; ``place`` as a
free-text name geocoded to a bbox; ``area`` as a substring of the Umbra
task (site) name (set ``fuzzy`` to match it loosely -- word-order- and
punctuation-independent and typo-tolerant, resolved deterministically with
no model call, so ``"beet piler"`` still reaches ``"Beet Piler - ND"`` and
``"utah centerfield"`` still reaches ``"Centerfield,
Utah"``; set ``semantic`` instead to treat ``area`` as a plain-language
*description* of a site whose name you don't know and resolve it to the
closest task names by *meaning* via the prebuilt embedding index, so
``"grain storage north dakota"`` reaches ``"Beet Piler - ND"`` -- a query
that shares no word with the label, which ``fuzzy`` cannot and should not
fake; ``semantic`` and ``fuzzy`` are mutually exclusive, and the resolved
task name is returned as ``resolved_area`` with the ranked candidates in
``semantic_matches`` so you can audit and retry with a different one, and
``min_score`` -- a cosine threshold in ``[0, 1]`` -- drops weak aliases, so
a description that matches nothing confidently returns an empty result
rather than an arbitrary top pick); ``start``/``end`` as acquisition-date
bounds -- an ISO
``YYYY-MM-DD`` date, a bare year/month (``2024``, ``2024-03``), or a
relative expression (``today``, ``yesterday``, ``3 months ago``,
``last month``), resolved deterministically with no model call;
``products`` to restrict to product types
(any of GEC, SICD, SIDD, CPHD); the SAR acquisition-property filters
``polarizations`` (keep items exposing any of these, e.g. ``["VV"]`` -- the
filter that keeps a change comparison like-with-like), ``min_incidence`` /
``max_incidence`` (view incidence-angle bounds in degrees) and
``max_resolution`` (keep items at least this fine, in metres) -- each a hard
predicate that excludes items missing that metadata; ``canonical`` to keep
the preferred copy of a collect Umbra republished under another prefix
(``True``), only the other copies (``False``), or every item when omitted;
``limit`` to cap
results; ``max_per_task`` to cap items per site (use 1 for a one-pin-per-site
overview).

``local`` selects the backend: leave it unset to use the on-disk index when
present (instant) and fall back to a live S3 walk otherwise. When the server
is configured with a Canopy token (``$UMBRA_CANOPY_TOKEN``), the search runs
against Umbra's authenticated commercial archive instead and ``source`` is
reported as ``"canopy-archive"``. Returns the per-item context cards, not
full STAC JSON, to protect the context window; call ``get_item`` for one
item's full metadata.

Prefer ``fuzzy=True`` (or :func:`find_repeat_sites`) when ``area`` shares
words with a task name; that path is deterministic and needs no key.
``semantic=True`` is only for a description that shares **no** tokens with
the label. It requires a task-embedding index built ahead of time with
``umbra semantic build`` and a user-supplied embedding key (``OPENAI_API_KEY``,
optionally ``OPENAI_BASE_URL`` / ``UMBRA_EMBED_MODEL``); it raises a helpful
setup error otherwise, so it never runs implicitly. The only model call is
turning ``area`` into a vector -- the resolved search over the chosen backend
stays fully deterministic.
NameRequiredDescriptionDefault
endNo
areaNo
bboxNo
fuzzyNo
limitNo
localNo
placeNo
startNo
productsNo
semanticNo
canonicalNo
min_scoreNo
intersectsNo
max_per_taskNo
max_incidenceNo
min_incidenceNo
polarizationsNo
max_resolutionNo

Output 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?

Beyond the simple `readOnlyHint`, the description provides crucial behavioral traits: it specifies the return format (compact cards, not full STAC JSON), the determinism of the search (no model call unless `semantic=True`), and the explicit logic behind `min_score` dropping weak matches.

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?

While the description is exceptionally dense and long, its structure follows a logical pattern of parameter-by-parameter definition, ensuring that despite its size, no critical information is lost or poorly placed.

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 high complexity and the fact that the input schema provides virtually no documentation, the description is maximally complete, explaining prerequisites (like the need for a task-embedding index for `semantic=True`) and output implications.

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

Parameters5/5

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

With 0% schema description coverage, the description carries the entire semantic weight. It defines units (WGS84, degrees, meters), syntax (ISO format vs. relative expressions), and the specific geometric requirements for complex parameters like `bbox` and `intersects`.

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 tool clearly states its core function: 'Search Umbra's catalog and return compact context cards.' It immediately distinguishes itself from potential alternatives by detailing the extensive filtering capabilities.

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 provides detailed decision matrices for usage, specifically comparing and contrasting: `bbox` vs `intersects`, `fuzzy` vs `semantic` filters for 'area', and specifying when to use `local` to target different backends (on-disk vs authenticated archive).

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

stack_provenanceA
Read-only
Inspect

Check whether a site's passes are one measurement, before measuring them.

``stack_stats`` refuses a selection whose rasters were made by *different*
``umbra convert`` settings — a calibrated pass differenced against an
uncalibrated one puts the difference between two conversions on the time
axis and reports it as change on the ground. This is the question that
refusal answers, asked ahead of it: it reads each acquisition's ``UMBRA_*``
conversion record straight from its raster header (kilobytes per pass, no
pixels, no co-registration) and groups the selection by what its pixel
values *are*.

Returns ``agrees`` (whether ``stack_stats`` would accept the selection),
``groups`` largest-first — each with the conversion ``record`` its members
share, their ``item_ids`` and the ``hrefs`` to re-run on — plus ``shared``
(the record they all agree on) when they agree, ``refusal`` (verbatim the
error ``stack_stats`` would raise) when they do not, and ``unreadable`` for
any source that could not be opened at all, which is an incomplete answer
rather than a mixed one.

Reach for it in two situations. **After** a ``stack_stats`` call fails with
a provenance refusal: ``groups[0]["hrefs"]`` is the largest set of passes
that *do* agree, so re-running ``stack_stats`` on those is a measurement
rather than a guess — the refusal itself cannot name that subset. And
**before** measuring a long series you did not assemble yourself, since the
check costs a header read per pass and saves the whole cube when the answer
is no.

A series of Umbra's published products as they ship (the common case) agrees
trivially: every pass reads as ``"(unrecorded)"``, which is one value, so
``agrees`` is true and ``shared`` is empty. **No model is called.**
NameRequiredDescriptionDefault
urlsYes
assetNoGEC

Output 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?

Goes well beyond readOnlyHint=true: it discloses the cost model (a header read per pass, kilobytes, no pixels, no co-registration), that no model is called, and how unreadable sources are treated differently from mixed ones. These are exactly the traits that determine whether an agent should spend a call here.

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?

Front-loaded with the core question, then usage, then returns, then the trivial-agreement caveat — a sensible order. Some prose is dense and could be trimmed (the paragraph re-explaining return keys), but nearly every sentence carries decision-relevant information.

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?

With an output schema present, the return-value narrative is partly redundant, but the description still supplies what the schema cannot: cost, the refusal-vs-unreadable distinction, and the '(unrecorded)' trivial-agreement case. The only real hole is that the inputs themselves are left unexplained.

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

Parameters2/5

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

Schema description coverage is 0% for two parameters, yet the description never defines them: 'urls' is only obliquely implied by talk of passes and assets, and 'asset' (default GEC) is never mentioned at all. The heavy return-value discussion does not compensate for undocumented inputs on a tool with zero schema 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?

States a specific verb and resource ('check whether a site's passes are one measurement') and makes the distinction from stack_stats concrete by naming the exact failure mode it pre-empts (a calibrated pass differenced against an uncalibrated one). An agent can choose between this and stack_stats without opening either schema.

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?

Gives explicit when-to-use guidance in two named situations: after a stack_stats provenance refusal (with the concrete remedy, groups[0]["hrefs"]) and before measuring a long series the caller did not assemble. It also notes the common case where the check is trivially satisfied, which steers agents away from over-using it.

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

stack_statsA
Read-only
Inspect

Measure how much a site changed across its passes, as numbers.

The quantitative counterpart to ``change_composite`` / ``timescan``: those
return a picture of *where* change is, this returns the *how much*. Pass the
STAC URLs of a site's passes (2 or more, any order); they are co-registered
onto one shared grid and reduced to a per-pass statistics series plus a net
baseline-to-latest record — mean/median/spread of each pass, the signed
decibel change against the pass before it, the fraction of ground that moved
past ``change_threshold_db``, and that fraction as an **area in km²**.

Change is always reported in decibels (a ratio of backscatter is a difference
on the log scale). The default ``crs="utm"`` puts the grid in the site's UTM
zone so every cell covers the same ground and the area figures mean
something; pass ``crs="EPSG:4326"`` for a lon/lat grid, and the areas come
back ``None`` rather than wrong. ``extent="intersection"`` (the default)
compares only ground every pass covers; ``"union"`` keeps all of it and
compares per cell where two passes overlap. ``bbox`` (lon/lat
``[min_lon, min_lat, max_lon, max_lat]``) narrows the measurement to a
sub-area, e.g. one facility inside the scene.

``blocks=N`` adds the *where* to the *how much*: the scene is cut into an
N x N grid (6 is a good default; 0, the default, skips it) and the extra
``spatial`` key reports each block's own net change, a compass label and
lon/lat centre to locate it by, and the consecutive pair of passes that
block moved most between — plus ``peak_block`` and an ASCII ``grid_text``
heat-map of the net change. Ask for it whenever the question is *where on
this site* something happened, or when a scene-wide mean looks small but the
picture from ``change_composite`` shows an obvious hot spot: a change
confined to one corner is averaged away scene-wide and stands out per block.

``block_series=True`` (which needs ``blocks``) keeps each block's *whole*
pass-to-pass sequence rather than only its peak interval, so a block that
drifted a little every pass reads differently from one that jumped once and
held. It is the largest payload this tool emits — ``blocks`` × ``blocks`` ×
(passes − 1) records — so ask for it only when the *shape* of the history is
the question, not the size of the change.

``speckle_filter="boxcar"`` or ``"lee"`` averages **speckle** down before
anything is measured. Speckle is not sensor noise: it is the interference
pattern coherent illumination makes on rough ground, and on single-look
imagery it scatters as widely as its own mean — so on a quiet site an
unfiltered per-cell decibel delta is mostly interference rather than change.
``"boxcar"`` averages every window (most variance removed, blind to the edges
it averages across); ``"lee"`` averages only where a window is no more
variable than speckle alone explains, so edges and bright points survive.
Reach for it when the change you are looking for is small, or when the
numbers look noisy against a picture that looks quiet; leave it off when the
question is about *fine* structure, because what it spends is resolution — a
``speckle_window``-cell window (odd, 5 by default) makes each cell report
ground that many cells across. The returned ``caveats`` say so, so a quoted
figure carries the trade with it.

Refuses to mix polarizations (HH and VV are not comparable). **No model is
called** — this is arithmetic over streamed COG overviews, so the numbers are
reproducible and safe to quote. Read the ``caveats`` before interpreting
them: Umbra's open products are not radiometrically calibrated, so a decibel
value is relative to the same ground on another date, and look geometry moves
backscatter too.
NameRequiredDescriptionDefault
crsNoutm
bboxNo
urlsYes
assetNoGEC
blocksNo
extentNointersection
max_sizeNo
block_seriesNo
speckle_filterNo
speckle_windowNo
change_threshold_dbNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

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

Annotations only say readOnlyHint=true; the description goes well beyond by declaring no model is called, arithmetic over streamed COG overviews, results reproducible and safe to quote, and by warning that Umbra's open products are not radiometrically calibrated so decibel values are relative. It also discloses payload-size cost for block_series and the resolution trade the caveats record.

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?

Front-loaded with the core purpose and the sibling contrast, then organized by parameter group with clear paragraph boundaries. It is long, and the speckle pedagogy ('it is the interference pattern coherent illumination makes on rough ground') is more explanation than an agent strictly needs, but almost every sentence either sets policy or explains a default.

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?

An output schema exists, so return shapes need not be enumerated, yet the description still names the extra keys (spatial, peak_block, grid_text, caveats) that only appear when specific flags are set — the one thing a schema check would not reveal. For a complex 11-parameter analytics tool with an unsafe-to-misread numeric output, nothing an agent needs to call it correctly is missing.

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?

Schema coverage is 0%, so the description must carry the load; it explains crs (utm vs EPSG:4326 and why areas become None), extent (intersection vs union semantics), bbox format and purpose, blocks (N x N, 0 default, 6 a good default), block_series dependency on blocks, speckle_filter values, speckle_window (odd, 5 default), and change_threshold_db's role. Only asset and max_size go unexplained, which is a minor gap at 11 parameters.

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?

States a precise verb and resource — measure how much a site changed across its passes, as numbers — and explicitly contrasts itself with change_composite and timescan ('those return a picture of *where* change is, this returns the *how much*'). An agent can route between these three siblings from the description alone.

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?

Gives explicit when-to-use conditions for each optional behavior: ask for blocks whenever the question is *where on this site*, or when a scene-wide mean looks small but change_composite shows a hot spot; use block_series only when the shape of history is the question; use speckle_filter when change is small or numbers look noisy, and leave it off for fine structure. Also states an input exclusion: refuses to mix polarizations.

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

stamp_descriptionA
Read-only
Inspect

Validate a client-produced scene reading and stamp provenance.

This is the interpretation boundary for the no-key kit path: you read the
picture ``describe_scene`` returned, produce
``{summary, observed_features, confidence, caveats}``, and pass it here.
The library checks the shape, stamps CC-BY and the AI-interpretation
note (the model never sets those), and — when ``image`` is the record
from the kit — appends a deterministic caveat if the picture was a
smaller baked preview. Until this returns, the reading is unvalidated
prose, not pipeline output.
NameRequiredDescriptionDefault
assetNoGEC
imageNo
modelNo
item_idNo
readingYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.9/5.0
Behavior4/5

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

Adds substantial behavior beyond readOnlyHint: it discloses shape validation, that CC-BY and the AI-interpretation note are stamped by the library rather than by the model, and that a deterministic caveat is appended when the image is a smaller baked preview. The 'stamping' language sits in mild tension with readOnlyHint, but the text implies an enriched return value rather than persisted mutation, so it is not a contradiction.

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?

Front-loads the verb-plus-resource statement, then layers the workflow and side effects in a short paragraph. A few phrases ('the interpretation boundary for the no-key kit path') are jargon-heavy, but no sentence is redundant.

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?

With an output schema present, return values need not be explained, and the description covers the input contract, the validation behavior and the provenance rules. The remaining gap is the undocumented asset/item_id parameters, which the description never mentions.

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 0%, so the description carries the burden. It fully documents the required `reading` object's expected keys and meaningfully describes the conditional `image` argument, but leaves `asset`, `model` (only obliquely referenced) and `item_id` unexplained.

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

Purpose4/5

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

States a specific verb and resource ('Validate a client-produced scene reading and stamp provenance') and frames the tool as the interpretation boundary that consumes what ``describe_scene`` produced. An agent can distinguish it from describe_scene, though it does not explicitly distinguish itself from stamp_narration, its nearest sibling.

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?

Gives a clear call order: read the picture describe_scene returned, formulate {summary, observed_features, confidence, caveats}, then pass it here. It also states the consequence of skipping it ('until this returns, the reading is unvalidated prose'). It stops short of naming exclusions or contrasting with stamp_narration.

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

stamp_narrationB
Read-only
Inspect

Validate a client-produced change narration and stamp provenance.

Sibling of :func:`stamp_description` for the no-key ``narrate_change``
kit. Pass the JSON you produced plus the ``change_stats`` grid from the
kit so the stamped object carries the numbers the prose was grounded in.
NameRequiredDescriptionDefault
assetNoGEC
modelNo
readingYes
item_idsNo
change_statsNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.3/5.0
Behavior3/5

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

readOnlyHint=true is already declared, so the safety profile is covered; the description adds that the tool validates and that the stamped object retains the grounding numbers. It does not say what happens when validation fails, or clarify that 'stamping' produces a returned object rather than persisting state — a genuine ambiguity given the word 'stamp'. Not a contradiction of the annotation, but an unresolved tension.

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

Conciseness3/5

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

Short enough, but front-loading is weakened by embedded reStructuredText markup (':func:`stamp_description`') that adds noise rather than meaning for an agent reader. The second sentence carries the useful operational detail; the first is fine.

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?

Output schema exists, so return values need no explanation, and the description correctly identifies the input pairing. But for a five-parameter validation tool with zero schema coverage and a subtle read-only-versus-stamp question, it leaves too much unstated: extra parameters, validation failure mode, and what 'provenance' is attached to.

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

Parameters2/5

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

Schema description coverage is 0%, so the description must carry all five parameters, and it only speaks to two: the 'reading' JSON and 'change_stats'. asset, model, and item_ids go entirely unmentioned in both schema and prose, leaving the agent to guess their meaning and defaults.

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

Purpose4/5

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

States a specific pair of verbs (validate, stamp provenance) against a specific resource (client-produced change narration), and names its sibling stamp_description so the agent can distinguish it. Not quite a 5 because 'stamp provenance' alone doesn't tell the agent what the output object looks like without help from the annotation/schema.

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?

Places the tool clearly in a workflow: it consumes output from the no-key narrate_change kit and must be fed the JSON produced plus the change_stats grid. That is a real usage condition, not just an implied one. No explicit when-not or failure-path guidance, so it stops short of a 5.

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

timescanB
Read-only
Inspect

Summarize a whole time series into one activity image.

Pass the STAC URLs of a site's passes; the timescan encodes per-pixel
temporal statistics so bright/colored areas are *where activity happened*
over the series. Returns the image block plus attribution.
NameRequiredDescriptionDefault
dbNo
urlsYes
assetNoGEC
max_sizeNo

TDQS

B3.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, and the description adds genuine value: it explains the semantics of the output (per-pixel temporal statistics, bright areas = activity) and states it returns an image block plus attribution. It doesn't touch auth or rate limits, but for a read-only summarization tool this is above the bar.

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?

Two tight sentences with the core transformation front-loaded and the elaboration following. Efficient, with little wasted text, though the output note could be merged more cleanly.

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

Completeness2/5

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

With four parameters at 0% coverage and no output schema, an agent needs more than this: the meaning, allowed values, and defaults of asset/db/max_size are unknown. The description does cover the return shape, but the parameter gaps make it incomplete for correct invocation.

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

Parameters2/5

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

Schema description coverage is 0% across four parameters, so the description must compensate. It only clarifies the required 'urls' parameter (STAC URLs of passes) and leaves db, asset, and max_size completely unexplained, leaving most of the schema opaque.

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

Purpose4/5

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

States a specific verb and transformation: 'summarize a whole time series into one activity image,' elaborated as per-pixel temporal statistics where bright areas mark activity. This is distinguishable from siblings like quicklook and stack_stats, though it doesn't explicitly contrast with them.

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

Usage Guidelines3/5

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

Says to pass STAC URLs of a site's passes, which implies when the tool applies, but there is no explicit when-to-use vs when-not, and no named alternative such as quicklook or change_composite for overlapping needs.

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

watch_siteAInspect

Report only the acquisitions new since the last check of this site.

SAR's value for monitoring is its cadence, so the natural workflow is
*standing*: run the same search each time and act only on what changed. This
tool packages that idempotent delta — call it in one turn, come back a day
(or a session) later and call it again, and it returns just the passes
published in between, not the whole list again. The scheduler is you: ask the
agent to check the site, and it reports the delta.

Define the site with the same filters as ``search_catalog`` — ``place``
(geocoded to a bbox), ``area`` (task/site-name substring, loosened by
``fuzzy``), ``bbox``, ``products``, and ``start``/``end`` date bounds. The
watch is identified by a stable ``name`` derived from those filters (pass an
explicit ``name`` to run several independent watches over the same site);
``reset=True`` re-establishes the baseline, reporting everything as new.

State persists in the local catalog index's ``meta`` table (created on first
use), so a watch survives across sessions with no extra setup. ``local``
selects the search backend exactly as in ``search_catalog`` — leave it unset
to use the on-disk index when present and a live S3 walk otherwise; for true
monitoring a live walk (``local=false``) catches freshly published passes.
**No model is called** — this is pure set arithmetic over the deterministic
search — and the returned ``new_items`` are context cards ready to hand
straight to ``change_composite`` / ``timescan``, closing the standing-analyst
loop (new pass → composite → describe) without leaving the conversation.
NameRequiredDescriptionDefault
endNo
areaNo
bboxNo
nameNo
fuzzyNo
localNo
placeNo
resetNo
startNo
productsNo

Output 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 provided, the description carries the full burden and does so well: it discloses idempotent delta semantics, persistent state in the catalog index meta table, reset baseline behavior, backend behavior, and that no model is called. It also explains that the result is produced by deterministic set arithmetic and returns context cards for downstream tools.

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 front-loaded with the key delta behavior and organized logically into workflow, parameters, state, and downstream use. It is somewhat long and occasionally narrative, but the length is largely justified by the tool's complexity and the absence of schema descriptions.

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 10 parameters, no annotations, and a complex stateful monitoring workflow, the description is complete enough for an agent to invoke it correctly. The existence of an output schema means return values need not be fully enumerated, and the description still adds useful downstream context.

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

Parameters5/5

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

Schema description coverage is 0%, so the description must compensate for all 10 parameters, and it does: it explains place geocoding, area substring and fuzzy matching, bbox, products, start/end bounds, name-derived watch identity, reset, and local backend selection. This adds substantial semantic meaning beyond the bare schema types and defaults.

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: reporting only acquisitions that are new since the last check of a site. It explicitly distinguishes the delta behavior from returning a whole list, and links the filters to the sibling search_catalog workflow.

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?

It describes the standing-monitoring workflow directly: run the same watch repeatedly and act only on what changed. It also explains reset behavior, independent watches via name, and backend choice via local, leaving little ambiguity about when and how to use it.

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. 19 tool updates
    • First observedchange_composite
    • First observeddescribe_scene
    • First observeddownload_asset
    • First observedfind_repeat_sites
    • First observedfind_similar
    • First observedfind_similar_text
    • First observedgeocode_place
    • First observedget_item
    • First observedindex_stats
    • First observednarrate_change
    • First observedpick_change_interval
    • First observedquicklook
    • First observedsearch_catalog
    • First observedstack_provenance
    • First observedstack_stats
    • First observedstamp_description
    • First observedstamp_narration
    • First observedtimescan
    • First observedwatch_site

Related MCP Connectors

Related MCP Servers

  • A
    license
    C
    quality
    D
    maintenance
    MCP server for the Geopera geospatial data platform that enables AI agents to discover imagery, place and manage orders, and run analytics using the same API as other Geopera clients.
    100
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables keyless search of the EU Copernicus Data Space catalogue, letting you find Sentinel-1/2/3/5P, DEM, land-cover, and burnt-area products by area and date and retrieve item ids, footprints, dates, and asset paths.
    17 npm
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables querying Sentinel-1/2, Landsat Collection 2, NAIP, and Copernicus DEM imagery by area and date, returning item IDs, footprints, cloud cover, and cloud-optimized GeoTIFF URLs.
    0
    MIT
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.