Skip to main content
Glama

list_operations

Read-onlyIdempotent

Find matching GIS operations by declaring what data you hold and what result you need, then review the returned candidates before choosing one.

Instructions

Find the operation you need. Say what you have and what you want — it matters more than the words you search with.

Ranking alone does not scale, and this is measured rather than assumed on independently written requests. Declaring what you already know makes ranking less important: when few enough operations survive, the whole set is handed over rather than a ranked shortlist. Delivery is not an accuracy figure: it depends on the surviving set staying small enough to return whole.

So fill these in whenever you know them, and you usually do:

  • input_kind — what you are holding: 'vector' (points, lines, polygons), 'raster' (a grid, a GeoTIFF), 'dataset' (either), 'plan', or 'none'.

  • produces — what you want back: 'dataset:vector', 'dataset:raster', 'answer' (a number, nothing written), 'description' (what something IS, rather than a computation over it), 'plan_result'.

  • category — the family, when you know it: vector, raster, terrain, hydrology, inspection, sql, network, planning, provenance, visualization, bridge. Unlike the others this one only ORDERS the results — a wrong guess about our families costs you positions, never the answer, so guessing is safe.

  • projected — pass False if your data is in a geographic CRS (degrees), and every operation that would refuse it disappears from the results.

  • dataset_inputs — how many datasets you are holding for this step: 1 if you have one layer, 2 if the operation combines two. This is the facet that makes a large catalog usable: on the current one it takes the surviving set from a median of 34 to 9, because "clip these parcels with that boundary" and "simplify these parcels" are different questions and you already know which one you have.

  • geometry — for a vector layer, what it holds: 'point', 'line' or 'polygon' (describe_dataset tells you), or a list for a mixed layer. Operations that cannot take that geometry drop out; operations that take any geometry always stay, so declaring it never hides one that fits. With two layers, list the geometry of both (points and polygons to count points in polygons). Unsure? Leave it out.

query is then plain words for what you are trying to do, and it breaks the tie inside what is left. Describe the PROBLEM rather than the operation: "the coastline has too many vertices and the browser dies" works as well as the name of the tool, and better when you do not know the name.

If the answer comes back as a single entry with status: "choose", that is the normal case and it is asking you to pick. It carries every operation that survived, in relevance order, each with the sentence saying what it is NOT for. The order is a hint and nothing else: our ranking puts the right operation in the top three 62% of the time, while a model reading the same candidates and choosing gets its first pick right 69% — and 70% is where the two model labellers who wrote the ground truth agree with EACH OTHER, so there is often no single right answer to rank toward. You have context no ranking has: which file is open, what ran a minute ago, what the person actually asked for. Use it. And if two candidates would both be defensible, ask them — that is a better move than picking one silently, and it is what a GIS analyst would do.

A order_is_weak field means the two rankers shared nothing in their top three, which usually means the request does not match this catalog well: read the candidates instead of trusting the order, and say so if none of them fits.

If the answer comes back with status: "unsure", the two ranking engines agreed on nothing and the set was too large to hand over — usually the request was not understood rather than impossible. It carries both engines' guesses and a question; answering the question with the facets above is the fastest way through.

If the answer comes back with status: "none_apply", nothing you declared can be true at once — no ranking ran. It lists each declaration and how many operations would come back without it, smallest first, so the one that is excluding everything is the first line. The common case is produces: several operations compute the number you want and write it into a column instead of returning it, so they declare dataset:vector. If nothing in relax helps, MapSmith probably does not do this — say so rather than running a neighbour.

detail=True adds parameters and worked example calls: use it on the exact operation name before calling an unfamiliar tool. An empty query lists everything that survives the facets, planned operations included.

engine selects the ranker and every result says which one ran: 'auto' (the default) prefers embeddings and falls back to BM25 where the model cannot load; 'lexical' is BM25 alone, deterministic and network-free; 'vector' forces embeddings. The default changed on measurement, not preference, and the facets above matter far more than this choice.

Tool call template

This tool declares no required parameters. Add optional parameters from the input schema as needed.

{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {},
    "name": "list_operations"
  }
}

Input Schema

NameRequiredDescriptionDefault
limitNo
queryNo
detailNo
engineNoauto
categoryNo
geometryNo
producesNo
projectedNo
input_kindNo
dataset_inputsNo

Output Schema

NameRequiredDescriptionDefault
resultYes

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changedv0.10.1
    • addedInput schema / properties / geometry
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "items": {
      +        "type": "string"
      +      },
      +      "type": "array"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "title": "Geometry"
      +}
  2. First observedv0.3.0

TDQS

A4.5/5.0
Behavior5/5

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

Annotations already declare readOnlyHint/idempotent, so safety is covered; the description then discloses substantial behavior beyond that: the status values choose/unsure/none_apply, what order_is_weak means, engine auto/lexical/vector with its network/fallback semantics, and how facets shrink the surviving set. The 'none_apply' relax-and-list diagnostic is especially valuable operational context.

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?

Front-loaded and bullet-structured, but roughly 700 words is excessive for a search tool. The paragraphs about ranking accuracy (62% vs 69% vs 70% inter-labeler agreement) and the measurement rationale for the engine default do not help an agent invoke the tool and should be cut.

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?

Comprehensive for a 10-parameter discovery tool with an output schema. Every facet, the detail/engine switches, and all three response statuses are covered, so an agent knows both how to call it and how to interpret each possible result. Nothing needed 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.

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 carries the full burden and largely meets it: input_kind, produces, category, projected, dataset_inputs, geometry, query, detail, and engine all get meaning plus accepted values and effects. Only limit is left undefined, a minor gap against nine well-specified parameters.

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 opens with a specific verb and resource: 'Find the operation you need' — a discovery/search operation over the GIS operation catalog, distinct from execution siblings like run_operation. The facet-based retrieval model is explained concretely. It never names a sibling tool it supersedes, so the differentiation from run_operation or describe_dataset is left implicit.

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?

Explicit, situational guidance throughout: fill in facets 'whenever you know them', use detail=True 'on the exact operation name before calling an unfamiliar tool', leave query empty to list everything surviving facets, and leave geometry out when unsure. It also prescribes behavior for each response status, including telling the agent to ask the user when two candidates are defensible — genuine when/when-not coverage.

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