Skip to main content
Glama

emem, the verifiable memory protocol for the physical world

Intent-routed planner

emem_intent

State what you want in one typed object and get the answer. You do not choose a primitive. type selects the intent AND the other fields that the tool reads. Send only the fields in its row. The plan runs in the same call: you get results, not a list of calls.

type | needs | optional | answers where_is | description | | cell64 for a named place what_is_here | cell OR place | description | what is attested at a location is_like | a, b | | cosine similarity of two cells did_change | cell, band, window | | delta for one band over [start,end] tslots find_like | key | k, filter | nearest cells by embedding confirm | claim, cell | | verdict and the signed facts behind it ask | description | place/cell/lat+lng | free-text question, packaged answer area_over_time | geometry, bbox OR areas; start_date, end_date | index, max_scenes | index of an area for each overpass, with spread and anomaly

An unknown or missing type returns a needs_intent_type envelope with the valid values. It is not a hard error.

When to use: Call this when the question matches one of the eight rows and you prefer to state the goal. Otherwise call the primitive. A band at a cell is emem_recall. A region is emem_recall_polygon. A free-text question about a place is emem_ask (type:"ask" sends it there). window takes tslots, not dates: get them from emem_trajectory. areas puts up to 6 areas on one chart. You can call a tool that this text names but your list does not show, by name, through tools/call.

Example arguments: {"type":"did_change","cell":"defi.zb64a.cAzU.zfa27","band":"indices.ndvi","window":[20245,20620]}

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
aNois_like only: cell64 of the first place in the pair.
bNois_like only: cell64 of the second place. The answer is a cosine similarity in [-1,1] over the two cells' embeddings.
kNofind_like only: how many neighbours to return.
keyNofind_like only: cell64 to search from, ranked by embedding cosine.
latNoask only: latitude, paired with `lng`, when you want to pin the location by coordinate rather than by name or cell64.
lngNoask only: longitude, paired with `lat`.
bandNodid_change only: which band to test, e.g. "indices.ndvi". One band per call; the answer is a delta over `window`, not a whole-cell diff.
bboxNo
cellNocell64 address, e.g. "defi.zb64a.cAzU.zfa27". Required by did_change and confirm. Optional for what_is_here and ask: supply it to skip geocoding, omit it and give `place` instead.
typeYesWhich intent; the table in the description gives each row's fields.
areasNoarea_over_time: up to 6 {id,geometry|bbox} on one chart
claimNoconfirm only: the claim to test at `cell`, e.g. {"band":"indices.ndvi","op":"gt","value":0.4}. The answer is a verdict plus the signed facts it rests on.
indexNo
placeNoFree-text place name for what_is_here and ask when you have a name but no cell64, e.g. "Ashok Nagar, Ranchi". The responder geocodes it. Ignored when `cell` is present.
filterNofind_like only: optional claim constraining which cells may be returned. Same object as `claim` below, same ops, same required fields.
windowNodid_change only: exactly two tslots, [start, end], band-tempo-relative integers from the emem epoch (NOT unix seconds or a date string). Get valid tslots for a cell from emem_trajectory.
end_dateNoYYYY-MM-DD
geometryNoarea_over_time: GeoJSON Polygon; or bbox {min_lat,min_lng,max_lat,max_lng}.
max_scenesNo
start_dateNoYYYY-MM-DD
descriptionNowhere_is: the place to resolve, e.g. "Mount Everest". ask: the user's question, forwarded verbatim. what_is_here: optional free text used as the question and, if `place` is absent, as the place. Ignored by the other intents.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • changedInput schema / properties / index / enum
      Previous value: -[
      -  "ndvi",
      -  "ndwi",
      -  "ndmi",
      -  "lswi",
      -  "vv",
      -  "vh",
      -  "vh_vv"
      -]New value: +[
      +  "ndvi",
      +  "ndwi",
      +  "ndmi",
      +  "lswi",
      +  "evi",
      +  "vv",
      +  "vh",
      +  "vh_vv"
      +]
  2. Changed1 schema field changed
    • changedInput schema / properties / index / enum
      Previous value: -[
      -  "ndvi",
      -  "ndwi"
      -]New value: +[
      +  "ndvi",
      +  "ndwi",
      +  "ndmi",
      +  "lswi",
      +  "vv",
      +  "vh",
      +  "vh_vv"
      +]
  3. Changed3 schema fields changed
    • addedInput schema / properties / areas
      Added value: +{
      +  "description": "area_over_time: up to 6 {id,geometry|bbox} on one chart",
      +  "maxItems": 6,
      +  "type": "array"
      +}
    • changedInput schema / properties / k / description
      Previous value: -"find_like only: how many neighbours to return. Defaults to the primitive's own default when omitted."New value: +"find_like only: how many neighbours to return."
    • changedInput schema / properties / key / description
      Previous value: -"find_like only: cell64 to search from. Neighbours are ranked by embedding cosine against this cell."New value: +"find_like only: cell64 to search from, ranked by embedding cosine."
  4. Changed9 schema fields changed
    • changedInput schema / description
      Previous value: -"A tagged union: `type` selects the intent and decides which OTHER fields are read. Fields belonging to a different intent are ignored, so send only the ones its row needs."New value: +"A tagged union on `type`; fields of other intents are ignored."
    • addedInput schema / properties / bbox
      Added value: +{
      +  "type": "object"
      +}
    • addedInput schema / properties / end_date
      Added value: +{
      +  "description": "YYYY-MM-DD",
      +  "type": "string"
      +}
    • addedInput schema / properties / geometry
      Added value: +{
      +  "description": "area_over_time: GeoJSON Polygon; or bbox {min_lat,min_lng,max_lat,max_lng}.",
      +  "type": "object"
      +}
    • addedInput schema / properties / index
      Added value: +{
      +  "enum": [
      +    "ndvi",
      +    "ndwi"
      +  ],
      +  "type": "string"
      +}
    • addedInput schema / properties / max_scenes
      Added value: +{
      +  "maximum": 24,
      +  "minimum": 3,
      +  "type": "integer"
      +}
    • addedInput schema / properties / start_date
      Added value: +{
      +  "description": "YYYY-MM-DD",
      +  "type": "string"
      +}
    • changedInput schema / properties / type / description
      Previous value: -"Which intent, and so which other fields are read: the table in this tool's description gives each row's needed and optional fields. `ask` runs locate, topic routing and recall server-side."New value: +"Which intent; the table in the description gives each row's fields."
    • changedInput schema / properties / type / enum
      Previous value: -[
      -  "where_is",
      -  "what_is_here",
      -  "is_like",
      -  "did_change",
      -  "find_like",
      -  "confirm",
      -  "ask"
      -]New value: +[
      +  "where_is",
      +  "what_is_here",
      +  "is_like",
      +  "did_change",
      +  "find_like",
      +  "confirm",
      +  "ask",
      +  "area_over_time"
      +]
  5. Changed1 schema field changed
    • changedInput schema / properties / type / description
      Previous value: -"Which question you are asking, and therefore which other fields apply. where_is: name a place, get its cell64 (needs `description`). what_is_here: summarise a location (needs `cell`, OR `place`/`description` to resolve it first). is_like: pairwise similarity (needs `a` and `b`). did_change: did one band move over a time window (needs `cell`, `band`, `window`). find_like: nearest neighbours to a known cell (needs `key`; optional `k`, `filter`). confirm: is a claim true at a cell (needs `claim` and `cell`). ask: free-text question about a place, runs locate + topic-route + recall server-side (needs `description`; optional `place`/`cell`/`lat`+`lng` to pin the location)."New value: +"Which intent, and so which other fields are read: the table in this tool's description gives each row's needed and optional fields. `ask` runs locate, topic routing and recall server-side."
  6. Changed1 schema field changed
    • changedInput schema / properties / cell / description
      Previous value: -"cell64 address, e.g. \"damO.zb000.xUti.zde78\". Required by did_change and confirm. Optional for what_is_here and ask: supply it to skip geocoding, omit it and give `place` instead."New value: +"cell64 address, e.g. \"defi.zb64a.cAzU.zfa27\". Required by did_change and confirm. Optional for what_is_here and ask: supply it to skip geocoding, omit it and give `place` instead."
  7. Changed2 schema fields changed
    • addedInput schema / properties / claim / properties / value / type
      Added value: +[
      +  "string",
      +  "number",
      +  "boolean",
      +  "array",
      +  "null"
      +]
    • addedInput schema / properties / filter / properties / value / type
      Added value: +[
      +  "string",
      +  "number",
      +  "boolean",
      +  "array",
      +  "null"
      +]
  8. Changed5 schema fields changed
    • addedInput schema / properties / claim / properties
      Added value: +{
      +  "agg": {
      +    "description": "How a `window` reduces: any/all quantify over the facts in it; mean/min/max compare the reduced value against `value`.",
      +    "enum": [
      +      "any",
      +      "all",
      +      "mean",
      +      "min",
      +      "max"
      +    ],
      +    "type": "string"
      +  },
      +  "band": {
      +    "description": "Band to test, e.g. \"indices.ndvi\".",
      +    "type": "string"
      +  },
      +  "op": {
      +    "description": "Comparison. These ten spellings and no others: `greater_than`, `>` and `gte` are all rejected. in/ni take an array `value` (member / not member). exists and absent ask only whether the band is attested here.",
      +    "enum": [
      +      "eq",
      +      "ne",
      +      "lt",
      +      "le",
      +      "gt",
      +      "ge",
      +      "in",
      +      "ni",
      +      "exists",
      +      "absent"
      +    ],
      +    "type": "string"
      +  },
      +  "tslot": {
      +    "description": "Test at one tslot. Omit for the latest. Mutually exclusive with `window`.",
      +    "type": "integer"
      +  },
      +  "value": {
      +    "description": "Right-hand side. A number for the ordering ops, an array for in/ni. REQUIRED by the parser even for exists/absent, which then ignore it — omitting it fails the whole intent with `missing field value`."
      +  },
      +  "window": {
      +    "description": "Test across [start, end] tslots instead of one. Requires `agg` to say how the values across the window collapse to a verdict.",
      +    "items": {
      +      "type": "integer"
      +    },
      +    "maxItems": 2,
      +    "minItems": 2,
      +    "type": "array"
      +  }
      +}
    • addedInput schema / properties / claim / required
      Added value: +[
      +  "band",
      +  "op",
      +  "value"
      +]
    • changedInput schema / properties / filter / description
      Previous value: -"find_like only: optional claim constraining which cells may be returned, same shape as `claim`."New value: +"find_like only: optional claim constraining which cells may be returned. Same object as `claim` below, same ops, same required fields."
    • addedInput schema / properties / filter / properties
      Added value: +{
      +  "agg": {
      +    "description": "How a `window` reduces to a single verdict.",
      +    "enum": [
      +      "any",
      +      "all",
      +      "mean",
      +      "min",
      +      "max"
      +    ],
      +    "type": "string"
      +  },
      +  "band": {
      +    "description": "Band the neighbour must satisfy, e.g. \"indices.ndvi\".",
      +    "type": "string"
      +  },
      +  "op": {
      +    "description": "Comparison. Symbolic only: `gt`, not `greater_than` or `>`.",
      +    "enum": [
      +      "eq",
      +      "ne",
      +      "lt",
      +      "le",
      +      "gt",
      +      "ge",
      +      "in",
      +      "ni",
      +      "exists",
      +      "absent"
      +    ],
      +    "type": "string"
      +  },
      +  "tslot": {
      +    "description": "Test at one tslot. Mutually exclusive with `window`.",
      +    "type": "integer"
      +  },
      +  "value": {
      +    "description": "Right-hand side. Required by the parser even for exists/absent, which ignore it."
      +  },
      +  "window": {
      +    "description": "Test across [start, end] tslots instead of one. Requires `agg`.",
      +    "items": {
      +      "type": "integer"
      +    },
      +    "maxItems": 2,
      +    "minItems": 2,
      +    "type": "array"
      +  }
      +}
    • addedInput schema / properties / filter / required
      Added value: +[
      +  "band",
      +  "op",
      +  "value"
      +]
  9. Changed18 schema fields changed
    • addedInput schema / description
      Added value: +"A tagged union: `type` selects the intent and decides which OTHER fields are read. Fields belonging to a different intent are ignored, so send only the ones its row needs."
    • addedInput schema / properties / a / description
      Added value: +"is_like only: cell64 of the first place in the pair."
    • addedInput schema / properties / b / description
      Added value: +"is_like only: cell64 of the second place. The answer is a cosine similarity in [-1,1] over the two cells' embeddings."
    • addedInput schema / properties / band / description
      Added value: +"did_change only: which band to test, e.g. \"indices.ndvi\". One band per call; the answer is a delta over `window`, not a whole-cell diff."
    • addedInput schema / properties / cell / description
      Added value: +"cell64 address, e.g. \"damO.zb000.xUti.zde78\". Required by did_change and confirm. Optional for what_is_here and ask: supply it to skip geocoding, omit it and give `place` instead."
    • addedInput schema / properties / claim / description
      Added value: +"confirm only: the claim to test at `cell`, e.g. {\"band\":\"indices.ndvi\",\"op\":\"gt\",\"value\":0.4}. The answer is a verdict plus the signed facts it rests on."
    • addedInput schema / properties / description / description
      Added value: +"where_is: the place to resolve, e.g. \"Mount Everest\". ask: the user's question, forwarded verbatim. what_is_here: optional free text used as the question and, if `place` is absent, as the place. Ignored by the other intents."
    • addedInput schema / properties / filter
      Added value: +{
      +  "description": "find_like only: optional claim constraining which cells may be returned, same shape as `claim`.",
      +  "type": "object"
      +}
    • addedInput schema / properties / k / description
      Added value: +"find_like only: how many neighbours to return. Defaults to the primitive's own default when omitted."
    • addedInput schema / properties / k / minimum
      Added value: +1
    • addedInput schema / properties / key / description
      Added value: +"find_like only: cell64 to search from. Neighbours are ranked by embedding cosine against this cell."
    • addedInput schema / properties / lat
      Added value: +{
      +  "description": "ask only: latitude, paired with `lng`, when you want to pin the location by coordinate rather than by name or cell64.",
      +  "maximum": 90,
      +  "minimum": -90,
      +  "type": "number"
      +}
    • addedInput schema / properties / lng
      Added value: +{
      +  "description": "ask only: longitude, paired with `lat`.",
      +  "maximum": 180,
      +  "minimum": -180,
      +  "type": "number"
      +}
    • addedInput schema / properties / place
      Added value: +{
      +  "description": "Free-text place name for what_is_here and ask when you have a name but no cell64, e.g. \"Ashok Nagar, Ranchi\". The responder geocodes it. Ignored when `cell` is present.",
      +  "type": "string"
      +}
    • addedInput schema / properties / type / description
      Added value: +"Which question you are asking, and therefore which other fields apply. where_is: name a place, get its cell64 (needs `description`). what_is_here: summarise a location (needs `cell`, OR `place`/`description` to resolve it first). is_like: pairwise similarity (needs `a` and `b`). did_change: did one band move over a time window (needs `cell`, `band`, `window`). find_like: nearest neighbours to a known cell (needs `key`; optional `k`, `filter`). confirm: is a claim true at a cell (needs `claim` and `cell`). ask: free-text question about a place, runs locate + topic-route + recall server-side (needs `description`; optional `place`/`cell`/`lat`+`lng` to pin the location)."
    • addedInput schema / properties / window / description
      Added value: +"did_change only: exactly two tslots, [start, end], band-tempo-relative integers from the emem epoch (NOT unix seconds or a date string). Get valid tslots for a cell from emem_trajectory."
    • addedInput schema / properties / window / maxItems
      Added value: +2
    • addedInput schema / properties / window / minItems
      Added value: +2
  10. Added
  11. Removed
  12. First observed

TDQS

Score is being calculated.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.