Skip to main content
Glama

emem, the verifiable memory protocol for the physical world

Ask a free-text question about a place

emem_ask

Answer a free-text question about a real-world location in one call. Signed satellite, elevation, water and built-up receipts support the answer. The tool sends the place and the question through the locate, recall and algorithm chain on the server, and returns one packaged envelope.

When to use: Call this when the question is about a specific place and the answer must carry its evidence. Send the question as q, with place, cell or lat+lng. Over MCP a point answer is a projection. It has answer, receipt (cite receipt.fact_cids), place_resolved, routed_to, facts_summary, algorithm_outcomes_summary, spatial_trace and scene_url. It has model_answer if you sent model, and _projection, which names what the projection removed. It has research_nearby when vouched research agents signed conclusions inside the place. Those are pointers only; read them with emem_inferences. POST /v1/ask has more: caveats, topic_routing, reasoning, and inventory with include:["inventory"]. A routed_to other than answer comes back complete. The answer gives a current value. For how X changed, use emem_intent did_change or emem_diff.

Example arguments: {"q":"is this neighbourhood flood-prone for a flat purchase","place":"Ashok Nagar, Ranchi"}

Input Schema

NameRequiredDescriptionDefault
qYesUser's natural-language question about the place (e.g. "is this neighbourhood flood-prone").
latNoWGS-84 latitude (paired with `lng`; alternative to `place` / `cell`).
lngNoWGS-84 longitude (paired with `lat`).
cellNocell64 string (alternative to `place`, use when you have one from a prior emem_locate / emem_recall response). Provide this OR `place` OR `lat`+`lng`.
modelNoOptional. Compose an EXTRA prose answer with a named model, returned as `model_answer` beside the deterministic `answer`. It does not replace it: `answer` is synthesised from the structured fields and never calls a model, so every number in it traces to a fact_cid, and asking for a model must not turn a checkable answer into an unchecked one. `model_answer` carries provenance.class = model_output. Name it by base_model (`nvidia/Cosmos3-Edge`), by family (`cosmos3_edge`, `gemma`), or by any fragment naming exactly one of them (`cosmos`); a fragment matching several is refused and names them; an unroutable name is refused with the list of routable ones, and a routable model whose service is not answering is refused as busy or down rather than silently substituted. Cosmos is refused while its host has no GPU.
placeNoFree-text place name (e.g. "Mount Fuji", "Ashok Nagar, Ranchi"). REQUIRED unless `cell` or `lat`+`lng` is provided. Extract the noun phrase from the user's turn; the responder geocodes via OSM Nominatim.
queryNoAlias for `q`.
includeNoOpt-in REST envelope sections. `reasoning` drops `algorithms_for_question`; add `algorithms` to keep it. The MCP projection ignores these.
verboseNoREST only: true adds per-algorithm formulas, band metadata and long prose. The MCP projection is small (about 7 KB) either way; the REST envelope is larger.
questionNoAlias for `q`.
include_imageNoBundle a Sentinel-2 RGB scene URL for the resolved cell. Adds ~1-2 s on first call.

Output Schema

NameRequiredDescriptionDefault
cellNoThe cell64 the question resolved to: emem's address for the place.
_meansNo
answerNoThe prose answer. Also in the content block, which carries the MCP projection; POST /v1/ask has the full envelope.
schemaYes
questionNoThe question as asked.
spatial_traceYesA spatial memory trace: what this responder has measured at this place, as primitives a model can reason over rather than a picture a person looks at.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • changedInput schema / properties / model / description
      Previous value: -"Optional. Compose an EXTRA prose answer with a named model, returned as `model_answer` beside the deterministic `answer`. It does not replace it: `answer` is synthesised from the structured fields and never calls a model, so every number in it traces to a fact_cid, and asking for a model must not turn a checkable answer into an unchecked one. `model_answer` carries provenance.class = model_output. Name it by base_model (`nvidia/Cosmos3-Edge`), by family (`cosmos3_edge`, `gemma`), or by any fragment naming exactly one of them (`cosmos`); a fragment matching several is refused and names them; an unroutable name is refused with the list of routable ones, and a routable model whose service is not answering is refused as busy or down rather than silently substituted. Cosmos deliberates and typically takes 13-22 s."New value: +"Optional. Compose an EXTRA prose answer with a named model, returned as `model_answer` beside the deterministic `answer`. It does not replace it: `answer` is synthesised from the structured fields and never calls a model, so every number in it traces to a fact_cid, and asking for a model must not turn a checkable answer into an unchecked one. `model_answer` carries provenance.class = model_output. Name it by base_model (`nvidia/Cosmos3-Edge`), by family (`cosmos3_edge`, `gemma`), or by any fragment naming exactly one of them (`cosmos`); a fragment matching several is refused and names them; an unroutable name is refused with the list of routable ones, and a routable model whose service is not answering is refused as busy or down rather than silently substituted. Cosmos is refused while its host has no GPU."
  2. Changed5 schema fields changed
    • changedInput schema / properties / include / description
      Previous value: -"Opt-in heavy response sections. Default response is slim (~5 KB): answer + algorithm key + fact_cids + caveats. Name specific sections to include them. Ignored when verbose=true (which includes everything)."New value: +"Opt-in REST envelope sections. `reasoning` drops `algorithms_for_question`; add `algorithms` to keep it. The MCP projection ignores these."
    • changedInput schema / properties / include / items / enum
      Previous value: -[
      -  "band_observations",
      -  "algorithm_outcomes",
      -  "facts_full",
      -  "temporal_composition",
      -  "foundation_embeddings",
      -  "scene",
      -  "inventory"
      -]New value: +[
      +  "band_observations",
      +  "algorithm_outcomes",
      +  "facts_full",
      +  "temporal_composition",
      +  "scene",
      +  "inventory",
      +  "reasoning",
      +  "algorithms"
      +]
    • changedInput schema / properties / verbose / description
      Previous value: -"When true, return the full envelope: per-algorithm formula strings, temporal_recipe blocks, per-fact band_metadata duplicates, and the long _explanation prose. Default (since 2026-05-05) is false so the response fits MCP's 25 KB cap; the signed receipt + fact CIDs + algorithm keys + algorithms_cid are always retained. Pass true to get the full body when debugging."New value: +"REST only: true adds per-algorithm formulas, band metadata and long prose. The MCP projection is small (about 7 KB) either way; the REST envelope is larger."
    • changedOutput schema / properties / answer / description
      Previous value: -"The prose answer. The same text is in the content block, which also carries the full envelope."New value: +"The prose answer. Also in the content block, which carries the MCP projection; POST /v1/ask has the full envelope."
    • changedOutput schema / properties / spatial_trace / properties / layers / items / properties / points / items / properties / f / description
      Previous value: -"Index into the fact_cids array in this result's text block. Dereference it to get the signed bytes."New value: +"Index into `receipt.fact_cids` (or the list `_projection.fact_cids_at` names). Dereference it for the signed bytes."
  3. Changed2 schema fields changed
    • changedOutput schema / properties / spatial_trace / properties / layers / items / properties / points / items / properties / value / description
      Previous value: -"The measured value, in the band's own units."New value: +"The measured value, in the band's own units. `null` where the band was looked for and not found: an absence is a reading."
    • addedOutput schema / properties / spatial_trace / properties / layers / items / properties / points / items / properties / value / type
      Added value: +[
      +  "number",
      +  "string",
      +  "boolean",
      +  "null"
      +]
  4. Changed1 schema field changed
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "properties": {
      +    "_means": {
      +      "type": "string"
      +    },
      +    "answer": {
      +      "description": "The prose answer. The same text is in the content block, which also carries the full envelope.",
      +      "type": "string"
      +    },
      +    "cell": {
      +      "description": "The cell64 the question resolved to: emem's address for the place.",
      +      "type": "string"
      +    },
      +    "question": {
      +      "description": "The question as asked.",
      +      "type": "string"
      +    },
      +    "schema": {
      +      "const": "emem.ask_structured.v1",
      +      "type": "string"
      +    },
      +    "spatial_trace": {
      +      "description": "A spatial memory trace: what this responder has measured at this place, as primitives a model can reason over rather than a picture a person looks at.",
      +      "properties": {
      +        "absent": {
      +          "description": "Bands this responder looked for and did not find. Absence is evidence: without it a consumer infers coverage nobody measured.",
      +          "items": {
      +            "properties": {
      +              "band": {
      +                "type": "string"
      +              }
      +            },
      +            "type": "object"
      +          },
      +          "type": "array"
      +        },
      +        "at": {
      +          "description": "[lat, lng] of the cell, so a point has a position without a second call.",
      +          "items": {
      +            "type": "number"
      +          },
      +          "type": "array"
      +        },
      +        "cell": {
      +          "type": "string"
      +        },
      +        "counts": {
      +          "description": "Totals taken BEFORE any cap, so truncation can be seen rather than guessed.",
      +          "properties": {
      +            "absent": {
      +              "type": "integer"
      +            },
      +            "absent_shown": {
      +              "type": "integer"
      +            },
      +            "points_shown": {
      +              "type": "integer"
      +            },
      +            "present": {
      +              "type": "integer"
      +            }
      +          },
      +          "type": "object"
      +        },
      +        "layers": {
      +          "description": "Points grouped by what kind of evidence they are: surface (what the ground is), built (what stands on it), now (what is happening there), embedding (vectors for similarity). A layer absent from this list means the question never reached that kind of evidence; a band looked for and not found is in `absent` instead.",
      +          "items": {
      +            "properties": {
      +              "layer": {
      +                "enum": [
      +                  "surface",
      +                  "built",
      +                  "now",
      +                  "embedding",
      +                  "other",
      +                  "ground"
      +                ],
      +                "type": "string"
      +              },
      +              "points": {
      +                "description": "One per signed reading.",
      +                "items": {
      +                  "properties": {
      +                    "age_s": {
      +                      "description": "How old the reading was when this answer was written.",
      +                      "type": "integer"
      +                    },
      +                    "band": {
      +                      "type": "string"
      +                    },
      +                    "class": {
      +                      "description": "Provenance class: direct_sensor, deterministic_index, estimator, model_output, attested_execution, human_curated, unclassified. What KIND of claim this is.",
      +                      "type": "string"
      +                    },
      +                    "f": {
      +                      "description": "Index into the fact_cids array in this result's text block. Dereference it to get the signed bytes.",
      +                      "type": "integer"
      +                    },
      +                    "unit": {
      +                      "type": "string"
      +                    },
      +                    "value": {
      +                      "description": "The measured value, in the band's own units."
      +                    }
      +                  },
      +                  "required": [
      +                    "band",
      +                    "value"
      +                  ],
      +                  "type": "object"
      +                },
      +                "type": "array"
      +              }
      +            },
      +            "required": [
      +              "layer",
      +              "points"
      +            ],
      +            "type": "object"
      +          },
      +          "type": "array"
      +        },
      +        "schema": {
      +          "const": "emem.spatial_trace.v1",
      +          "type": "string"
      +        },
      +        "stage": {
      +          "description": "Which stage of the answer grounded these readings.",
      +          "type": "string"
      +        },
      +        "truncated": {
      +          "type": "boolean"
      +        }
      +      },
      +      "required": [
      +        "schema",
      +        "layers",
      +        "counts"
      +      ],
      +      "type": "object"
      +    }
      +  },
      +  "required": [
      +    "schema",
      +    "spatial_trace"
      +  ],
      +  "type": "object"
      +}
  5. Changed1 schema field changed
    • changedInput schema / properties / model / description
      Previous value: -"Optional. Compose an EXTRA prose answer with a named model, returned as `model_answer` beside the deterministic `answer`. It does not replace it: `answer` is synthesised from the structured fields and never calls a model, so every number in it traces to a fact_cid, and asking for a model must not turn a checkable answer into an unchecked one. `model_answer` carries provenance.class = model_output. Name it by base_model (`nvidia/Cosmos3-Edge`) or by family (`cosmos3_edge`, `gemma`); an unroutable name is refused with the list of routable ones, and a routable model whose service is not answering is refused as busy or down rather than silently substituted. Cosmos deliberates and typically takes 13-22 s."New value: +"Optional. Compose an EXTRA prose answer with a named model, returned as `model_answer` beside the deterministic `answer`. It does not replace it: `answer` is synthesised from the structured fields and never calls a model, so every number in it traces to a fact_cid, and asking for a model must not turn a checkable answer into an unchecked one. `model_answer` carries provenance.class = model_output. Name it by base_model (`nvidia/Cosmos3-Edge`), by family (`cosmos3_edge`, `gemma`), or by any fragment naming exactly one of them (`cosmos`); a fragment matching several is refused and names them; an unroutable name is refused with the list of routable ones, and a routable model whose service is not answering is refused as busy or down rather than silently substituted. Cosmos deliberates and typically takes 13-22 s."
  6. Changed1 schema field changed
    • addedInput schema / properties / model
      Added value: +{
      +  "description": "Optional. Compose an EXTRA prose answer with a named model, returned as `model_answer` beside the deterministic `answer`. It does not replace it: `answer` is synthesised from the structured fields and never calls a model, so every number in it traces to a fact_cid, and asking for a model must not turn a checkable answer into an unchecked one. `model_answer` carries provenance.class = model_output. Name it by base_model (`nvidia/Cosmos3-Edge`) or by family (`cosmos3_edge`, `gemma`); an unroutable name is refused with the list of routable ones, and a routable model whose service is not answering is refused as busy or down rather than silently substituted. Cosmos deliberates and typically takes 13-22 s.",
      +  "type": "string"
      +}
  7. Changed2 schema fields changed
    • addedInput schema / properties / query
      Added value: +{
      +  "description": "Alias for `q`.",
      +  "type": "string"
      +}
    • addedInput schema / properties / question
      Added value: +{
      +  "description": "Alias for `q`.",
      +  "type": "string"
      +}
  8. Changed1 schema field changed
    • changedInput schema / properties / cell / description
      Previous value: -"cell64 string (alternative to `place` — use when you have one from a prior emem_locate / emem_recall response). Provide this OR `place` OR `lat`+`lng`."New value: +"cell64 string (alternative to `place`, use when you have one from a prior emem_locate / emem_recall response). Provide this OR `place` OR `lat`+`lng`."
  9. Changed1 schema field changed
    • addedInput schema / properties / include
      Added value: +{
      +  "description": "Opt-in heavy response sections. Default response is slim (~5 KB): answer + algorithm key + fact_cids + caveats. Name specific sections to include them. Ignored when verbose=true (which includes everything).",
      +  "items": {
      +    "enum": [
      +      "band_observations",
      +      "algorithm_outcomes",
      +      "facts_full",
      +      "temporal_composition",
      +      "foundation_embeddings",
      +      "scene",
      +      "inventory"
      +    ],
      +    "type": "string"
      +  },
      +  "type": "array"
      +}
  10. Changed3 schema fields changed
    • addedInput schema / properties / cell / maxLength
      Added value: +23
    • addedInput schema / properties / cell / minLength
      Added value: +19
    • addedInput schema / properties / cell / pattern
      Added value: +"^(?:(?:[bcdfghjklmnpqrstvwxyz][aeiouAEIOU]){2}|z[0-9a-f]{4})(?:\\.(?:(?:[bcdfghjklmnpqrstvwxyz][aeiouAEIOU]){2}|z[0-9a-f]{4})){3}$"
  11. Changed1 schema field changed
    • addedInput schema / properties / verbose
      Added value: +{
      +  "default": false,
      +  "description": "When true, return the full envelope: per-algorithm formula strings, temporal_recipe blocks, per-fact band_metadata duplicates, and the long _explanation prose. Default (since 2026-05-05) is false so the response fits MCP's 25 KB cap; the signed receipt + fact CIDs + algorithm keys + algorithms_cid are always retained. Pass true to get the full body when debugging.",
      +  "type": "boolean"
      +}
  12. Changed4 schema fields changed
    • removedInput schema / anyOf
      Removed value: -[
      -  {
      -    "required": [
      -      "place"
      -    ]
      -  },
      -  {
      -    "required": [
      -      "cell"
      -    ]
      -  },
      -  {
      -    "required": [
      -      "lat",
      -      "lng"
      -    ]
      -  }
      -]
    • removedInput schema / description
      Removed value: -"Single-shot free-text answer about a real-world location. `q` is always required. Exactly one location form is also required: `place` (free text — extract the noun phrase from the user's turn), `cell` (cell64 from a prior call), or both `lat`+`lng`."
    • changedInput schema / properties / cell / description
      Previous value: -"cell64 string (alternative to `place` — use when you have one from a prior emem_locate / emem_recall response)."New value: +"cell64 string (alternative to `place` — use when you have one from a prior emem_locate / emem_recall response). Provide this OR `place` OR `lat`+`lng`."
    • changedInput schema / properties / place / description
      Previous value: -"Free-text place name (e.g. \"Mount Fuji\", \"Ashok Nagar, Ranchi\"). Use this when the user's turn names a place — extract the noun phrase yourself; the responder geocodes via OSM Nominatim."New value: +"Free-text place name (e.g. \"Mount Fuji\", \"Ashok Nagar, Ranchi\"). REQUIRED unless `cell` or `lat`+`lng` is provided. Extract the noun phrase from the user's turn; the responder geocodes via OSM Nominatim."
  13. Changed6 schema fields changed
    • addedInput schema / anyOf
      Added value: +[
      +  {
      +    "required": [
      +      "place"
      +    ]
      +  },
      +  {
      +    "required": [
      +      "cell"
      +    ]
      +  },
      +  {
      +    "required": [
      +      "lat",
      +      "lng"
      +    ]
      +  }
      +]
    • addedInput schema / description
      Added value: +"Single-shot free-text answer about a real-world location. `q` is always required. Exactly one location form is also required: `place` (free text — extract the noun phrase from the user's turn), `cell` (cell64 from a prior call), or both `lat`+`lng`."
    • changedInput schema / properties / cell / description
      Previous value: -"cell64 string (alternative to `place`)."New value: +"cell64 string (alternative to `place` — use when you have one from a prior emem_locate / emem_recall response)."
    • changedInput schema / properties / lng / description
      Previous value: -"WGS-84 longitude."New value: +"WGS-84 longitude (paired with `lat`)."
    • changedInput schema / properties / place / description
      Previous value: -"Free-text place name. One of `place`, `cell`, or (`lat`+`lng`) is required."New value: +"Free-text place name (e.g. \"Mount Fuji\", \"Ashok Nagar, Ranchi\"). Use this when the user's turn names a place — extract the noun phrase yourself; the responder geocodes via OSM Nominatim."
    • changedInput schema / properties / q / description
      Previous value: -"User's natural-language question about the place."New value: +"User's natural-language question about the place (e.g. \"is this neighbourhood flood-prone\")."
  14. First observed

TDQS

A4.2/5.0
Behavior4/5

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

Goes well beyond annotations: it explains the server-side locate/recall/algorithm chain, that a point answer is a 'projection' and `_projection` names what was removed, that `routed_to` other than answer comes back complete, that `model_answer` is model_output provenance and refused rather than silently substituted, and that research_nearby entries are pointers only. The one gap is side effects: annotations say readOnlyHint=false and idempotentHint=false, but the description never says what the call writes or persists server-side, which is exactly the kind of context annotations cannot convey.

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?

Front-loaded and the when-to-use is easy to find, but the middle is a dense enumeration of envelope fields (answer, receipt, place_resolved, routed_to, facts_summary, algorithm_outcomes_summary, spatial_trace, scene_url, model_answer, _projection, research_nearby) that an output schema already exists to convey. The model parameter discussion in prose also duplicates an unusually detailed schema description.

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-value detail is not strictly required, and the description still covers routing, provenance class of model answers, projection lossiness, and where to read research pointers. What is missing is any statement about server-side effects or why a question-answering call is neither read-only nor idempotent per annotations.

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

Parameters3/5

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

Schema description coverage is 100%, so baseline is 3. The description does add the locator disjunction ('q with place, cell or lat+lng') and that model produces a parallel `model_answer` rather than replacing `answer`, but it also mixes in REST-only levers (include, verbose) whose semantics are already spelled out in the schema, so most of the parameter burden is still carried by structured data.

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+resource+scope: 'Answer a free-text question about a real-world location in one call.' It then names the concrete siblings it is not (emem_intent did_change, emem_diff) and points to emem_inferences for research pointers, so the agent can separate it from the other emem_* tools without opening a 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?

Has an explicit 'When to use' clause tied to a condition (question about a specific place, answer must carry evidence) and an explicit exclusion routing elsewhere: 'For how X changed, use emem_intent did_change or emem_diff.' The distinction between the MCP projection and the fuller POST /v1/ask is also stated.

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

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.