Tool reference

The MCP gateway turns Geopera’s operation surface into roughly 188 callable tools. Each tool name is a dotted operation_id, its input schema is that operation’s typed request body, and it carries the same scope and side-effect tier the operation enforces on POST /v1/op/{operation_id}.

The surface now includes the read and list operations an agent uses to read back what it creates — list and fetch orders, collections, items, notifications, balances, usage, job lists, alert rules and events, API keys, analytics indices, STAC search, and more. Every read tool carries readOnlyHint, so a well-behaved client knows it is safe to call freely. The practical effect: an agent can place an order and then poll its status, or create a collection and then list its contents, without leaving the governed surface.

The gateway adds nothing the operation does not already declare: it names each tool by its operation_id and stamps safety hints derived from the operation’s scope and side-effect tier. For how to connect a client, see Hosted MCP and the local quickstart.

How an operation becomes a tool

Every Geopera operation is reachable as POST /v1/op/{operation_id} with a JSON body. The gateway exposes one tool per customer-facing operation. The mapping is direct:

MCP conceptSource on the operation
Tool nameoperation_id (e.g. catalog.search)
Input schemathe operation’s typed request body
x-api-key input fieldoptional header parameter forwarded with the request
Required scopex-required-scope
Side-effect tierx-side-effect
Safety hintsderived from x-side-effect (see below)

The tool name is the canonical operation identity, not a slugified label. Calling the catalog.search tool with a body is exactly equivalent to POST /v1/op/catalog.search with that body, run as the identity behind the bearer token your MCP client presents. Scopes and authentication are unchanged from the HTTP surface — see Authentication and Scopes.

Side-effect tiers and safety hints

The gateway translates each operation’s x-side-effect tier into MCP ToolAnnotations so a client can reason about safety before it calls:

x-side-effectreadOnlyHintdestructiveHintidempotentHintopenWorldHint
readtruefalsefalsetrue
computefalsefalsefalsefalse
destructivefalsetruefalsefalse
external_spendfalsefalsetruetrue
share_exportfalsefalsefalsetrue

external_spend tools (money or external provider spend) are marked idempotent because their dedicated route honours an Idempotency-Key — a repeat with the same key is side-effect-free. See Idempotency and Errors. The scope and tier are also placed in each tool’s structured meta (x-required-scope, x-side-effect, x-produces) so a client can filter or route without parsing the description text.

Why some operations are not tools

A focused set of operations stays excluded. None of these are things an agent needs to work around — each is excluded for a concrete reason:

  • Raster tiles and rendered images — map tiles and rendered PNG/JPEG/TIFF/WebP outputs (for example cog.tile.render, WMTS capabilities). These are frontend map plumbing meant for a tile-rendering map view, not a request-to-single-result tool.
  • Binary downloads — file exports, generated reports (reports.generate), and clip downloads (clip.job.download) return large binary payloads. Those belong on a signed URL the agent can hand off, not inlined into a tool result, so the download operation itself is withheld.
  • Streaming responses — NDJSON and server-sent-event listings and exports (for example catalog.search_stream) do not fit the MCP request → single-result model. Their paged, non-streaming siblings are exposed instead (the paged stac.search and catalog.search are tools; the streaming export is not).
  • Admin, cron, and unsafe mutations — admin/internal/cron operations are scrubbed from the customer surface entirely, and a small set of untyped destructive or external-spend mutations is withheld for safety. The governed, typed mutations you need — place an order, create a collection, top up credits — remain available with their side-effect hints intact (see the side-effect table above).

To enumerate the exact tools your gateway exposes at runtime, call list_tools from your MCP client and read each tool’s name, annotations, and meta.

Exposed tools by domain

The tables below list representative tools, grouped by operation domain — both the read/list tools an agent uses to inspect state and the governed mutations it uses to change it. Each row is callable as the tool of that name and as POST /v1/op/{name}. For the authoritative, up-to-the-minute set, call list_tools from your MCP client.

catalog

ToolSummaryScopeSide-effect
catalog.searchSearch a commercial-imagery host’s catalog (STAC, price-enriched)catalog:readread
catalog.federated_searchSearch every data source covering the AOI in one querycatalog:readread
catalog.granule_pointsExtract a 3D point cloud from a GEDI or ICESat-2 granulecatalog:readread
catalog.sources.listList every searchable data source + its collectionscatalog:readread
stac.searchSTAC-compliant search across the catalog (paged)catalog:readread

items

ToolSummaryScopeSide-effect
items.getFetch a single catalog item by iditems:readread
items.searchSearch a project’s items with STAC-compatible filtersitems:readread
items.search_orgSearch all items across the caller’s organizationitems:readread
items.createCreate an item within a projectitems:writecompute
items.updateUpdate an item’s mutable metadataitems:writecompute
items.duplicateDuplicate an item with its assets + viz profilesitems:writecompute
items.detect_asset_bandsAuto-detect band names from reflectance statisticsitems:readcompute
items.set_asset_band_namesRename the bands on an item’s assetitems:writecompute
items.deleteSoft-delete an itemitems:writedestructive

assets

ToolSummaryScopeSide-effect
assets.deleteDelete an asset (file) from an itemitems:writedestructive

collections

ToolSummaryScopeSide-effect
collections.createCreate an organizing collection within a projectcollections:writecompute
collections.updateUpdate a collection’s metadatacollections:writecompute
collections.deleteSoft-delete a collection, unlinking its itemscollections:writedestructive

projects

ToolSummaryScopeSide-effect
projects.createCreate a workspace in the caller’s organizationprojects:writecompute
projects.updateUpdate a workspace’s metadataprojects:writecompute
projects.archiveArchive a workspace, hiding it from the default listprojects:writecompute
projects.add_memberAdd a member to a workspaceprojects:writecompute
projects.update_memberChange a member’s role in a workspaceprojects:writecompute
projects.remove_memberRemove a member from a workspaceprojects:writedestructive
projects.deletePermanently delete a workspace and all its dataprojects:writedestructive

orders

ToolSummaryScopeSide-effect
orders.listList the org’s orders, with status and filtersorders:readread
orders.getFetch a single order by id (poll its status)orders:readread
orders.archive.estimatePreview the AOI price for a cart of archive capturesorders:readread
orders.tasking.estimatePreview the price for an AOI-priced tasking requestorders:readread
orders.tasking.sensorsList the tasking sensor catalogorders:readread
orders.tasking.templates.listList the org’s active tasking templatesorders:readread
orders.tasking.templates.saveSave a reusable tasking acquisition templateorders:writecompute
orders.tasking.templates.deleteSoft-delete a tasking templateorders:writecompute
orders.updatePatch an order’s tags (metadata only)orders:writecompute
orders.placePlace order(s) from a FeatureCollectionorders:writeexternal_spend
orders.archive.placePlace an archive orderorders:writeexternal_spend
orders.tasking.placePlace a tasking orderorders:writeexternal_spend
orders.cancelCancel an order (policy-gated), refunding its reservationorders:writeexternal_spend

processing

ToolSummaryScopeSide-effect
processing.createCreate a processing jobprocessing:processexternal_spend
processing.create_and_dispatchCreate and dispatch a processing jobprocessing:processexternal_spend
processing.dispatchDispatch an existing pending job to its workerprocessing:processexternal_spend
processing.executeExecute a process (reserve credits + dispatch)processing:processexternal_spend

clip

ToolSummaryScopeSide-effect
clip.create_from_itemCreate a clip from an itemprocessing:processexternal_spend

analytics

ToolSummaryScopeSide-effect
analytics.indices.listList the available spectral indicesanalytics:readread
analytics.operations.listList the registered analytics operationsanalytics:readread
analytics.executeRun a registered analytics operationanalytics:processread
analytics.validate_formulaValidate a band-math formula without executinganalytics:readread

band_formulas

ToolSummaryScopeSide-effect
band_formulas.getFetch a custom band-math formula by idband_formulas:readread
band_formulas.createCreate a custom band-math formulaband_formulas:writecompute
band_formulas.updateUpdate a custom band-math formulaband_formulas:writecompute
band_formulas.deleteDelete a custom band-math formulaband_formulas:writedestructive

visualization

ToolSummaryScopeSide-effect
visualization.list_forThe visualizations available for an itemtiles:readread
visualization.profile.createCreate a visualization profile for an itemitems:writecompute
visualization.profile.updateUpdate a visualization profileitems:writecompute
visualization.profile.set_defaultSet a profile as the item’s defaultitems:writecompute
visualization.profile.deleteDelete a visualization profileitems:writedestructive

uploads

ToolSummaryScopeSide-effect
uploads.initiateStart an upload session, reserving storage quotauploads:writecompute
uploads.signed_urlMint a signed URL for uploading a fileuploads:writecompute
uploads.progressUpdate an upload session’s progressuploads:writecompute
uploads.completeComplete an upload sessionuploads:writecompute
uploads.failMark an upload session failed, releasing its reservationuploads:writecompute

share

ToolSummaryScopeSide-effect
share.link.validateValidate a share link and return the shared targetshares:readread
share.link.createCreate a password-protected share linkshares:writeshare_export
share.link.revokeRevoke a share linkshares:writedestructive

provenance

ToolSummaryScopeSide-effect
provenance.getWalk the provenance/lineage graph for an entityprovenance:readread

alerts

ToolSummaryScopeSide-effect
alerts.rules.listList the org’s alert rulesalerts:readread
alerts.rule.getFetch a single alert rule by idalerts:readread
alerts.events.listList alert events, with filtersalerts:readread
alerts.test_ruleTest-evaluate an alert rule without persistingalerts:readread
alerts.create_ruleCreate an alert rule for the caller’s organizationalerts:writecompute
alerts.update_ruleUpdate an alert rulealerts:writecompute
alerts.acknowledge_eventMark an alert event acknowledgedalerts:writecompute
alerts.delete_ruleDelete an alert rulealerts:writedestructive

event_subscriptions

ToolSummaryScopeSide-effect
event_subscriptions.createCreate a webhook subscriptionevent_subscriptions:writecompute
event_subscriptions.updateUpdate a webhook subscriptionevent_subscriptions:writecompute
event_subscriptions.testSend a test event and return the delivery resultevent_subscriptions:writecompute
event_subscriptions.deleteDelete a webhook subscriptionevent_subscriptions:writedestructive

notifications

ToolSummaryScopeSide-effect
notifications.listList the caller’s notificationsnotifications:readread
notifications.mark_readMark one notification as readnotifications:writecompute
notifications.mark_all_readMark all unread notifications as readnotifications:writecompute
notifications.dismissDismiss one of the caller’s notificationsnotifications:writecompute

billing

ToolSummaryScopeSide-effect
billing.approvals.requestRequest approval for a large credit purchasebilling:writecompute
billing.approvals.rejectReject a pending credit-purchase approvalbilling:writecompute
billing.set_auto_topupConfigure automatic top-upbilling:writecompute
billing.approvals.approveApprove a credit purchase and charge the saved cardbilling:writeexternal_spend
billing.topupTop up creditsbilling:writeexternal_spend

payment_methods

ToolSummaryScopeSide-effect
payment_methods.create_setup_intentStart saving a card to the org (off-session)billing:writecompute
payment_methods.attachPersist a saved card for the orgbilling:writecompute
payment_methods.set_defaultMake a saved payment method the org’s defaultbilling:writecompute
payment_methods.detachDetach a saved payment method from the orgbilling:writedestructive

api_keys

ToolSummaryScopeSide-effect
api_keys.listList the org’s API keys (metadata only, no secrets)api_keys:readread
api_keys.createMint an organization API key (secret returned once)api_keys:writeshare_export
api_keys.revokeRevoke an organization API keyapi_keys:writedestructive

organizations

ToolSummaryScopeSide-effect
organizations.createCreate an organization and enroll the caller as ownerorganizations:writecompute

Worked example: the catalog.search tool

catalog.search (scope catalog:read, side-effect read) searches a commercial-imagery host’s STAC catalog and price-enriches the results. As an MCP tool it carries readOnlyHint=true, and its input schema is the operation’s typed request body, CatalogSearchInput:

FieldTypeRequiredNotes
host_namestringyesthe imagery host to search
bboxnumber[]nobounding box [west, south, east, north]
intersectsobjectnoGeoJSON geometry to intersect
collectionsstring[]norestrict to specific collections
idsstring[]nofetch specific item ids
datetimestringnoRFC 3339 instant or interval
queryobjectnoper-field filters; e.g. cloudCoverage maps to {GT,GTE,LT,LTE}
limitintegernodefault 100, min 1, max 500
nextstringnoopaque pagination cursor
full_catalogbooleannosearch the host’s full catalog

The tool also exposes an optional x-api-key header field, mapped from the operation’s header parameter and forwarded with the request; in normal use your MCP client’s bearer token is the identity, so you leave it unset. See Pagination for the next cursor contract and Concepts for the operation model.

A tool call carries arguments matching that schema:

json
{
	"host_name": "umbra",
	"bbox": [-122.52, 37.7, -122.35, 37.83],
	"datetime": "2024-06-01T00:00:00Z/2024-09-01T00:00:00Z",
	"query": { "cloudCoverage": { "LTE": 10 } },
	"limit": 50
}

Because the tool maps directly to the operation, the same arguments are a valid HTTP request body. The equivalent direct call:

bash
curl -X POST https://api.geopera.com/v1/op/catalog.search \
  -H "Authorization: Bearer gpra_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
    "host_name": "umbra",
    "bbox": [-122.52, 37.70, -122.35, 37.83],
    "datetime": "2024-06-01T00:00:00Z/2024-09-01T00:00:00Z",
    "query": { "cloudCoverage": { "LTE": 10 } },
    "limit": 50
  }'

Errors surface as RFC 9457 application/problem+json on the HTTP surface and propagate to the tool result — a missing scope, an invalid body, or a rate limit all carry a typed type and detail. See Errors and Rate limits.

See also

  • Hosted MCP — connecting an MCP client with OAuth or a forwarded token
  • Local quickstart — running the gateway over stdio with a static token
  • Operations — the full operation index behind every tool
  • Scopes — what each *:read / *:write scope grants