Skip to main content
Glama

emem, the verifiable memory protocol for the physical world

Server Details

Shared memory for AI agents. One address per fact, one signature you check. No key to read.

If you are the author of this connector, you can claim ownership with GitHub, an HTTP challenge, or a DNS record. Claimed connector authors can inspect health checks, view analytics, and manage their listing.
Status
Healthy
Uptime
96.3% over 39 days
Last Tested
Transport
Streamable HTTP · MCP 2025-11-25
URL
Repository
Vortx-AI/emem
GitHub Stars
60
Server Listing
emem

TDQS

A4.4/5.0

Scored across 18 tools

Disambiguation3/5

Most tools have distinct jobs and the descriptions actively point at siblings (entity vs entity_resolve vs entity_link; fetch vs memory_token_resolve; ask vs intent). Still, several read/dereference tools overlap materially (search/recall, fetch/memory_token_resolve, emem_intent's ask forwarding to emem_ask), so an agent can misselect among them despite the guidance.

Naming Consistency4/5

The dominant emem_ prefix plus action-oriented names (emem_locate, emem_recall, emem_verify_receipt) makes the family predictable, and entity_*/memory_* subgroups are coherent. The un-prefixed fetch and search, plus a few noun-style names (emem_intent, emem_tools), are minor but visible deviations from the pattern.

Tool Count4/5

18 tools sits at the upper boundary of a reasonable MCP catalog, but the scope is broad and each tool maps to a distinct workflow step in a verifiable-memory lifecycle. The explicit framing as a curated core (with the full catalog discoverable via emem_tools) keeps it from feeling bloated.

Completeness4/5

The surface covers the essential lifecycle end to end: locate/name, recall/search/fetch, cite/resolve, echo-verify/receipt-verify, entity create/resolve/link, and contradiction detection. Notable extras like writing facts or trajectory data are absent from the core list, but emem_tools advertises the wider 114-tool catalog, so agents are not left at a dead end.

Available Tools

18 tools
emem_askAsk a free-text question about a placeA
Idempotent
Inspect

Single-shot free-text answer about a real-world location, backed by signed satellite/elevation/water/built-up receipts. Forwards a place mention plus a question; runs the locate → recall → algorithm chain server-side; returns one packaged envelope.

When to use: Call when the question is about a specific place and the answer should carry its own evidence. Send the user's question verbatim as q plus a location as place (free text), cell (cell64), or lat+lng. One envelope comes back: answer, spatial_trace (the readings as primitives, each point indexing fact_cids), facts_summary, receipt and fact_cids at the ROOT, and caveats naming grid resolution and revisit cadence. Missing bands are materialised on demand. include: ["reasoning"] adds the ordered stages with their detail; include_image: true bundles a Sentinel-2 thumbnail. A question outside the corpus answers topic_routing.matched_topic: null with the inventory, so you can route elsewhere rather than guess.

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

ParametersJSON 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 deliberates and typically takes 13-22 s.
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 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).
verboseNoWhen 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.
questionNoAlias for `q`.
include_imageNoBundle a Sentinel-2 RGB scene URL for the resolved cell. Adds ~1-2 s on first call.

Output Schema

ParametersJSON Schema
NameRequiredDescription
cellNoThe cell64 the question resolved to: emem's address for the place.
_meansNo
answerNoThe prose answer. The same text is in the content block, which also carries 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.

TDQS

A4.5/5.0
Behavior5/5

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

The annotations already provide readOnlyHint=false, openWorldHint=true, idempotentHint=true, destructiveHint=false, so the safety profile is handled. The description goes well beyond that: it reveals the server-side locate→recall→algorithm chain, that "missing bands are materialised on demand," that the response is a single envelope with `caveats` naming grid resolution and revisit cadence, that verbose output "fits MCP's 25 KB cap," and that the optional `model` path never replaces the deterministic `answer` (provenance.class = model_output, with named latency 13–22 s). Without reading anything else, the agent is fully aware of what happens server-side, how long it takes to run, and what it will and won't return.

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 (first sentence states the single-shot evidence-backed purpose), has a clearly signposted "When to use" section, and ends with a JSON example — excellent structure for an 11-parameter tool with a complex response envelope. It could be tightened: several sentences (e.g., the `model` and `verbose` behaviors, the alias list, part of the envelope enumeration) repeat what the input schema already documents in comparable detail.

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 tool this complex — 11 params, an output schema, sibling tools like emem_locate/emem_recall — the description covers the critical context: the decision to call where to call, how to pick among place/cell/lat+lng, the shape of the output envelope, the caveats/inventory return, and the fallback routing behavior. An output schema covers the return-values, so those is not necessarily required here. Remaining gaps are minor (e.g., no mention of auth requirements or rate limits), but the main deficiencies are covered.

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 100%, so the baseline is 3, but the description does add meaning: it says to send the user's question "verbatim" as `q`, gives a concrete example argument mapping, clarifies that `place` only works as an alternative to `cell` (which must come from a prior emem_locate/emem_recall response, relative to lat/lng pairs), and frames disguised response sections ("added ordered stages" via include). It does not however describe the `query`/`question` aliases or add much over the schema for `lat`/`lng`/`include_image`, so the top of the 1–5 range isn't reached.

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 leads with a specific verb+resource: "Single-shot free-text answer about a real-world location, backed by signed satellite/elevation/water/built-up receipts." It then makes the differentiation explicit by naming the server-side chain it runs ("locate → recall → algorithm chain") and by referencing sibling tools emem_locate and emem_recall as sources of `cell`. An agent can tell exactly what this tool does versus geocoding (emem_locate) or raw recall (emem_recall).

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?

The description gives an explicit when-to-use: "Call when the question is about a specific place and the answer should carry its own evidence," plus concrete instruction (send the user's question verbatim as `q` and a location via `place`/`cell`/`lat`+`lng`). It also defines the boundary condition ("A question outside the corpus answers... matched_topic: null with the inventory, so you can route elsewhere rather than guess"). It falls short of 5 because it never explicitly names a sibling as the alternative for out-of-scope questions or says when NOT to call this tool beyond the corpus-boundary case.

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

emem_echo_verifyCheck a value against the fact it cites, before you publish itA
Read-onlyIdempotent
Inspect

Grade a value you are about to emit against the signed fact your citation points at. Returns matches and, when it does not, the drift between what you were about to say and what emem holds. This is the step that turns a transcription error into a caught event instead of a silent wrong number: a model that resolves a fact correctly can still retype 0.2411 for 0.241103, and nothing else in the loop notices. Memory algebra: the verify operation (https://emem.dev/docs/model.html).

When to use: Call immediately before publishing, logging, or handing on any value you took from an emem fact, and treat a false matches as a gate rather than a warning. Pair it with value_verbatim from resolve: quote that exact decimal string rather than reformatting the number, then echo-verify what you actually emitted. For a due-diligence or compliance record this is what lets you assert every cited value was echo-verified with a signed check per citation instead of a promise. Accepts a bare cid too, so a damaged citation still grades rather than failing closed.

Example arguments: {"token":"emem:fact:defi.zb572.xoso.zb1ec:4qj3l4mgh7ch5kvxmkqspjdl6y42oqhm42khh3gostccpixkbz5q","claimed_value":"-0.0522"}

ParametersJSON Schema
NameRequiredDescriptionDefault
tokenYesThe citation you used. Any form resolve accepts, including a bare cid, which answers with `degraded: true`: a bare cid asserts no location, so the cell-binding check is skipped and the grade covers the value only. A cid that is not 52 characters is refused as a damaged citation rather than as a missing one, and must not be retried.
strictNoRequire BYTE-IDENTICAL equality. Default false, which also accepts a numerically equal value spelled differently (0.50 for 0.5). It changes exactly one outcome: the numerically-equal-but-respelled case, which passes by default and becomes `drift: "reformatted"` here. `rounded` and `wrong` already fail either way, so `strict` never turns a pass into a pass. It is also inert when `claimed_value` came in as a JSON number, because the respelling then happened in the JSON parser, before this tool saw it.
claimed_valueYesThe value you are about to publish, as a string or a number. Send it as a STRING, character for character as you will emit it. A JSON number is stringified before the comparison, so `0.50` arrives as `0.5` and `0.2411000` as `0.2411` (measured against the live responder): the trailing digits this check exists to defend are gone before it runs. Quote `value_verbatim` from resolve as a string and echo the exact characters you will publish.

Output Schema

ParametersJSON Schema
NameRequiredDescription
driftNoThe difference between what you wrote and what emem holds, when they disagree. Explicit null on an exact match: the key is always present, so branch on its value rather than on whether it exists. Declaring this `string` alone was a live schema violation on every matching call, which is how it was found.
tokenYesThe citation you passed, echoed back exactly as sent.
matchesYesWhether what you were about to publish agrees with the signed fact. Treat false as a gate, not a warning.
receiptNo
degradedNoTrue when a bare cid was passed and the cell binding could not be checked.
fact_cidNo
claimed_valueYesEchoed back, so a log line carries both sides of the comparison.
canonical_tokenNoThe token in its canonical spelling, whatever form you passed.
offline_verify_atNoWhere to re-run this check without trusting this responder.
resolved_value_verbatimNoThe fact's value as the exact decimal string it was signed as. Quote this rather than reformatting it.

TDQS

A5/5.0
Behavior5/5

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

Beyond annotations, the description discloses nuanced behaviors: `strict` changes exactly one outcome, JSON numbers lose trailing digits before comparison, and a non-52-character cid is refused as damaged. These are load-bearing edge cases an agent needs to know before calling.

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 long but every sentence carries operational weight: the primary purpose, the verification workflow, the strict-mode caveats, and a concrete example. It is well-structured with a 'When to use' section and front-loaded core behavior.

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?

With an output schema present and annotations covering the read-only, idempotent safety profile, the description still fills all practical gaps: return semantics, failure modes, parameter formatting, and pairing guidance. Nothing needed for confident invocation or selection 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 coverage is 100%, yet the description adds substantial value beyond it: it explains why `claimed_value` should be sent as a string, how `strict` interacts with numeric respelling, and how bare cids alter the grade. This goes well above the schema's own parameter descriptions.

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: 'Grade a value you are about to emit against the signed fact your citation points at,' and says it returns `matches` and `drift`. It clearly distinguishes this echo-verification step from related tools by naming the verify operation and pairing it with `value_verbatim` from resolve.

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 gives explicit timing and conditions: 'Call immediately before publishing, logging, or handing on any value you took from an emem fact,' and instructs treating a false `matches` as a gate. It also names the companion tool, `value_verbatim`, and explains when a bare cid is appropriate.

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

emem_entityMint or get a canonical object identityA
Idempotent
Inspect

Give a real-world object (a bridge, a farm plot, a river, a named place) a single, shared, content-addressed identity that any agent resolves the same way. Returns an entity_token (emem:entity:<entity_cid>) plus a signed receipt that attests how the reference resolved. Two agents that name the same object mint the SAME entity_cid; when a stable external id (Overture GERS / OSM) is known it dominates identity, so divergent labels for one real object still collapse to one id. This is the object-level antidote to referential drift: 'the damaged bridge near the river' becomes one canonical thing every model reasons about, not a phrase each model re-interprets.

When to use: Call when a conversation refers to a THING and you want a handle that survives summarisation and travels between agents, before it drifts into 'that infrastructure issue'. Anchor it with place, cell, or lat+lng, then hand the emem:entity: token to any peer and they dereference the same object; recall at its cell64 for signed facts. Pick the sibling: this one MINTS or returns an identity you can anchor; emem_entity_resolve finds one someone already registered from a fuzzy phrase; emem_entity_link asserts two spellings you hold mean one object. Not for an observation (that is a fact: emem_recall or emem_memory_token) and not for naming a place (that is emem_locate). An entity is a thing AT a place.

Example arguments: {"label":"Golden Gate Bridge","kind":"bridge","place":"Golden Gate Bridge, San Francisco"}

ParametersJSON Schema
NameRequiredDescriptionDefault
latNoLatitude anchoring the object to a place, paired with lng. The identity is hashed from this anchor, so two agents anchoring the same object differently mint different entities.
lngNoLongitude, paired with lat.
cellNocell64 to anchor the object directly (no geocode).
kindNoObject class: bridge, river, farm_plot, building, admin_division, place, custom, ... Defaults to "place".
labelYesHuman name of the object, e.g. "Golden Gate Bridge", "the north dam". Required.
placeNoFree-text place to anchor the object (geocoded). Provide place OR cell OR lat+lng.
parentNoOptional parent entity_cid (containment).
external_idsNoStable ids that drive convergence. Caller-supplied values win over geocoder-derived ones.

TDQS

A4.8/5.0
Behavior5/5

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

The description adds substantial behavioral context beyond annotations. It explains the idempotence (same object mints same entity_cid), the dominance of external IDs (Overture GERS / OSM) in identity, the anchoring mechanism (lat/lng/cell), and the return format (entity_token plus signed receipt). It also clarifies the conceptual boundary (entity is a thing AT a place). None of this contradicts the annotations; it complements them.

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 relatively long but well-structured, starting with a clear purpose and then layering usage guidance and examples. The 'When to use' and 'Pick the sibling' sections are front-loaded after the opening paragraph. While every sentence earns its place, it is denser than strictly necessary; a slightly tighter version would merit a 5.

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 8 parameters, nested objects, and no output schema, the description covers all essential aspects: what the tool does, when to use it, how it behaves (idempotent, anchor-driven), what it returns (entity_token + signed receipt), and parameter semantics (anchoring, external IDs). Nothing critical is missing for an agent to call it correctly.

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 100%, so the schema already documents all parameters. The description adds meaningful guidance: it explains the anchor requirement (place OR cell OR lat+lng) and that external_ids drive convergence and override geocoder-derived values. It also provides a concrete example argument set. This goes beyond the schema, though it does not exhaustively annotate every parameter, so a 4 is appropriate.

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 (mint/get) and resource (canonical object identity) and explains the core behavior: content-addressed identity that resolves consistently. It explicitly distinguishes itself from siblings (emem_entity_resolve, emem_entity_link, emem_recall, emem_locate) by naming what it is not. The purpose is unambiguous and the agent can tell it apart 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 Guidelines5/5

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

There is an explicit 'When to use' section that tells the agent to call when referencing a THING and wanting a stable handle, and it names the sibling alternatives with the conditions that select them (emem_entity_resolve for fuzzy search, emem_entity_link for asserting two spellings). It also gives clear negative guidance: not for observations (emem_recall) or naming a place (emem_locate). No ambiguity remains about when to invoke this tool.

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

emem_entity_resolveResolve a phrase (or emem:entity: token) to a canonical objectA
Read-onlyIdempotent
Inspect

Find the objects agents have bound a phrasing to, ranked by INDEPENDENT corroboration, never arrival order. Each candidate carries asserted_by, disputed_by, independent_attesters and corroboration (single_key | multiple_independent_keys | none_attributed); contested is set when more than one object claims the name. text for candidates, near to narrow by place, or an emem:entity: token to dereference. Read-only; alias text is other agents' data.

When to use: Call BEFORE minting and before citing: resolve first, mint only if nothing matches, read corroboration before you cite. A single_key binding is one agent's claim about a shared name; if you can vouch for it, corroborate it with emem_entity_link so the next reader sees two keys.

Example arguments: {"text":"the golden gate bridge","near":"San Francisco"}

ParametersJSON Schema
NameRequiredDescriptionDefault
kNoMax candidates (default 10).
nearNoOptional place/cell to narrow to objects anchored nearby.
textNoFuzzy phrasing to resolve to an existing canonical object (e.g. "the damaged bridge near the river").
labelNoAlias for `text`.
tokenNoA `emem:entity:<entity_cid>` handle to dereference directly to its signed object (bypasses the text search).

TDQS

A4.8/5.0
Behavior5/5

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

Annotations cover the safety profile (readOnly, idempotent, non-destructive), and the description goes further by disclosing the ranking rule, the candidate fields returned (asserted_by, disputed_by, independent_attesters, corroboration enum), the contested flag behavior, and the data-provenance caveat that alias text is other agents' data. With no output schema, this return-shape disclosure is doing real work.

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, then return semantics, then usage, then an example. Dense but each sentence carries information; the enum listing and field names are slightly list-heavy but justified given no output schema.

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 five-param, output-schema-less resolver, the description covers purpose, return shape, ranking semantics, usage ordering, and the corroboration follow-up. Nothing an agent needs to call it correctly or interpret results 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 100%, so the baseline is 3, and the description adds semantic routing above that: which of text/near/token to use and for what purpose ('text for candidates, near to narrow by place, or an emem:entity: token to dereference'), plus a worked example argument combining text and near. It stops short of explaining k or label, which the schema already covers.

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 ('Find the objects agents have bound a phrasing to') and immediately differentiates the ranking semantics ('ranked by INDEPENDENT corroboration, never arrival order'). An agent can distinguish this resolver from siblings like emem_entity_link and emem_find_similar 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?

The 'When to use' block gives explicit sequencing ('Call BEFORE minting and before citing: resolve first, mint only if nothing matches') and names the complementary action and tool (corroborate a single_key binding with emem_entity_link). When, why, and the alternative are all present.

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

emem_find_similark-NN over the corpus by embeddingA
Idempotent
Inspect

k-NN over the corpus by cell embedding or inline vector. Returns neighbours ordered nearest-first, each with cell64, score and the band scanned, plus a signed receipt over the vectors read. Scoring is mode: cosine is exact fp32; hamming is a sign-bit popcount that scans far more cells for the same budget; hamming_then_rerank does both. k is 1..1000, default 10. It ranks what the corpus already holds; only when the KEY's own vector is missing does it materialise that one band for the key, signed and reported in materialize_notes, then retry. Neighbours are never materialised, so an empty result means nobody has attested a vector nearby, not that nowhere resembles the key.

When to use: Call when the user asks 'find places like X', 'where else looks like this', or hands an embedding to find neighbours. key is either a cell64 or inline:[x,y,...]. Default band is geotessera (128-D Tessera foundation embedding); pass band: "geotessera.multi_year" for the 1152-D 9-vintage (2017–2025) fusion.

Example arguments: {"key":"damO.zb000.xUti.zde78","k":10}

ParametersJSON Schema
NameRequiredDescriptionDefault
kNoHow many neighbours to return.
keyYescell64 (look up that cell's vector) or 'inline:[x,y,...]' literal vector
bandNovector band to scan (default: 128-D Tessera foundation embedding). For mode=hamming/hamming_then_rerank you can pass either the cosine band (e.g. 'geotessera') or its binary sibling ('geotessera.bin128'), the responder picks the right one.geotessera
cellNoAlias for `key`.
modeNoScoring mode. cosine = fp32 over full vector (precise, ~256 B/cell scan). hamming = sign-bit popcount over the binary sibling band (~16 B/cell, ~1000× faster, ~65% recall@10). hamming_then_rerank = triage with Hamming on 4·k candidates then re-rank by cosine, matches cosine precision at ~16× less work.cosine
scopeNoMulti-tenant scope `{user_id, agent_id, run_id, org_id}`. Setting it bypasses the ANN index entirely, because that index carries no scope column, and runs the brute-force scan instead: the tenant filter is honoured truthfully, and the call is slower.
cell64NoAlias for `key`.
filterNoClaim-algebra predicate evaluated against every candidate before ranking. A cell with no fact for the filter's band is DROPPED rather than treated as false, so 'places like X where NDVI > 0.5' never silently includes cells with no NDVI.
as_of_tslotNoBi-temporal valid-time bound. Applied to candidate cells BEFORE cosine scoring, a cell with no fact whose tslot ≤ as_of_tslot under the scoring band is dropped from the candidate pool (undecidable→drop). When set, the Lance ANN fast-path is bypassed (the index has no signed_at column); brute-force k-NN runs instead so as_of is honoured truthfully.
as_of_signed_atNoBi-temporal transaction-time bound (RFC 3339). Also applied to candidates BEFORE cosine. Same Lance-bypass note as as_of_tslot.

TDQS

A4.8/5.0
Behavior5/5

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

The description adds rich behavioral context far beyond the annotations: mode tradeoffs (exact vs approximate vs rerank), the meaning of an empty result under open-world semantics, the materialisation behavior for a missing key vector, and the Lance-index bypass for scope/as-of filters. It also clarifies that filter-relevant cells with no fact are dropped rather than treated as false. This aligns with and enriches the openWorldHint/idempotentHint annotations.

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 dense but well organized: it front-loads the core return contract, then explains scoring modes, k bounds, open-world semantics, when to use, and an example. The occasional redundancy with the schema is minor and serves narrative clarity rather than padding.

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 tool with no output schema, the description fully explains the return shape, the meaning of missing neighbours, the side-effect of materialising the key's band, mode/band selection, and the consequences of scope/as_of/filter. An agent has everything needed to decide, invoke, and interpret the result correctly.

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?

Although schema coverage is 100%, the description adds substantial parameter meaning: mode-specific precision/performance tradeoffs, band naming and dimensionality, the effect of scope and as_of on the ANN fast-path, and the semantic behavior of the filter. This goes well beyond the schema's own property descriptions.

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 operation (k-NN over the corpus) with a concrete resource (cell embedding or inline vector) and exact outputs (ordered neighbours with cell64, score, band, and signed receipt). It also disambiguates by giving canonical user phrasings ('find places like X', 'where else looks like this'), making it clearly distinct from sibling memory/entity 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?

The description has an explicit 'When to use' section with concrete query phrasings and example arguments, plus guidance on choosing bands and modes. It does not name specific sibling tools to avoid, nor give explicit 'when not to use' conditions, so it stops just short of full routing guidance.

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

emem_guard_verdictCheck whether the citations in a draft actually verifyA
Read-onlyIdempotent
Inspect

Run emem-guard's policy pipeline over text you are about to send, against this responder's corpus. Finds every emem: citation, resolves each one, and returns allow or deny with a machine-readable reason: EMEM-GUARD DENY <CODE> token=<token|-> fix=<fix> leaf=<leaf|->. Codes are PROV_SIG (signature did not verify), PROV_BYTES (resolved to different content than claimed), PROV_DRIFT (reading has moved past its band threshold), CLAIM_UNGROUNDED (a measurable claim with no citation, opt-in via claim_gating). fix is the actionable half: refresh_token, remove_reference, contact_admin, cite_observation. ADVISORY: nothing is blocked, and a citation this responder does not hold is never a denial, because it is indistinguishable from one minted elsewhere. Memory algebra: the verify operation (https://emem.dev/docs/model.html).

When to use: Call it on your own draft before you assert something, or on a tool result before you reason on it, to catch a citation that does not resolve while you can still fix it. claim_gating: true also names measurable claims with no citation and the band that would answer them. For a payload another framework produced (CloudEvent, OPA input, OpenAI moderations body, another server's tool call) send it as-is and name its shape: the default reader sees only texts, and a check that read nothing still answers allow. To ENFORCE rather than consult, emem_guard_selfhost returns the procedure for your own node.

Example arguments: {"texts":["Elevation there is 918 m per emem:fact:defi.zb493.xuqA.zcb5f:yqbolgeoycqkvj3zkxukb4bjw4odhpwvfzqo3fbgwf4spk45zala"]}

ParametersJSON Schema
NameRequiredDescriptionDefault
agentNoOptional free-text label for who is asking. Advisory only, never a trust boundary.
shapeNoWhich envelope YOUR payload is in, so you never have to reshape it to ask the question: send the body your own framework produced and name its shape. native reads `texts`; `mcp` reads a JSON-RPC tools/call or tool result; `openai` reads a moderations (`input`) or chat-completions body; `cloudevent` reads a CloudEvents 1.0 structured event; `policy` reads {input}. It matters: a CloudEvent whose citation sits at data.text is invisible to the native reader, and a check that read nothing answers `allow`, so confirm `citations_found` matches what you sent. Unrecognised values fall back to native rather than erroring. This selects how the body is READ only — the verdict always comes back in this tool's declared output shape, because a tool that declares an outputSchema owes conforming structuredContent. To get the ANSWER translated into the same envelope too (an OPA `result:{allow,deny}`, an MCP CallToolResult to substitute on a deny), call POST /v1/guard/verdict?shape=… directly.native
textsNoFree text to check, and the only input this tool needs. Send just the pieces the question is about: a draft answer, a tool result, one turn. Do not send surrounding conversation, because nothing here reads it and a checker should ask for the smallest input that answers the question.
claim_gatingNoAlso flag measurable physical-world claims that carry NO citation (deny code CLAIM_UNGROUNDED, fix cite_observation). Off by default: it reports on the absence of a citation rather than on a failed check. The verdict names the sentence, the magnitude, and the emem band that would answer it.

Output Schema

ParametersJSON Schema
NameRequiredDescription
fixNoThe actionable half: what to change and retry.
codeNoPresent only on a deny.
claimNoOn CLAIM_UNGROUNDED: the sentence, magnitude, quantity, anchor, and source_band. source_band is a recallable band key, or null when this responder observes no band in that quantity.
actionYesNOT a clearance. `allow` means no rule fired, which on a transcript that cited nothing is silence rather than approval. Branch on citations_found and receipt.fact_cids.
checkedYesHow many were actually resolved, bounded by the verdict budget.
receiptYesed25519 receipt. `fact_cids` lists what actually resolved and is the field that separates a real citation from an invented one.
advisoryYesTrue on the hosted route, where nothing is blocked. Run your own node to enforce.
citations_foundYesHow many emem: tokens were found in the text. Compare with receipt.fact_cids: a well-formed token that resolved to nothing counts here and not there.

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already declare readOnlyHint, idempotentHint, destructiveHint, and openWorldHint. The description adds crucial behavioral nuance: nothing is blocked (advisory), a citation not held is never a denial, a check that reads nothing still answers allow, and unrecognized shape values fall back to native. These go well beyond the annotations and materially change how an agent interprets results.

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 long but every sentence earns its place. It opens with the core purpose, then usage guidance, then an example. It is structured with clear paragraphs and inline code for the verdict format and codes. No fluff, and the density is appropriate for a tool with subtle behavior.

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 4-parameter tool with an output schema and multiple siblings, the description covers purpose, usage, alternatives, behavior, parameter nuances, and an example. It even references the verify operation with a documentation link. Nothing an agent needs to call this 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 100% with rich descriptions, so the baseline is 3. The description adds value beyond the schema: for 'shape' it explains the fallback behavior and the importance of matching citations_found; for 'texts' it advises sending only the smallest relevant input; for 'claim_gating' it explains the resulting deny code and fix. This extra context justifies a 4 rather than a 3.

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 ('Run'), the resource (emem-guard's policy pipeline), and the exact outcome (finds citations, resolves them, returns allow/deny with codes). It distinguishes itself from siblings by naming the enforcement alternative (emem_guard_selfhost) and from other verification tools like emem_verify_receipt via the corpus-scoped, advisory nature.

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?

A dedicated 'When to use' paragraph gives explicit contexts: check drafts before asserting, check tool results before reasoning, and catch unresolvable citations while still fixable. It also says when NOT to use it (for enforcement, use emem_guard_selfhost) and explains the shape parameter for external payloads. This is complete and actionable.

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

emem_intentIntent-routed plannerA
Idempotent
Inspect

Say what you want in one typed object and get the answer, without choosing a primitive. type is a tagged union: it selects the intent AND decides which other fields are read, so send only the fields its row needs. The plan is EXECUTED in the same call, so you receive the result (the resolved cell64, the similarity, the delta, the verdict), not a list of calls to make yourself.

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 plus the signed facts behind it ask | description | place/cell/lat+lng | free-text question, packaged answer

An unknown or missing type returns a structured needs_intent_type envelope naming the seven values rather than a hard error, so you can correct it on the next turn.

When to use: Call when the question maps onto one of the seven rows above and you would rather state the goal than pick a primitive. Otherwise go direct: a band at a cell is emem_recall, a region is emem_recall_polygon, a free-text place question is emem_ask (type:"ask" forwards to it). window takes tslots, not dates: get them from emem_trajectory. A tool named here but absent from tools/list is not a dead end: every one of the 114 dispatches by name at /mcp and /mcp/full; the core list is 18 to keep the catalog small, and emem_tools enumerates the rest.

Example arguments: {"type":"did_change","cell":"damO.zb000.xUti.zde78","band":"indices.ndvi","window":[20245,20620]}

ParametersJSON 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. Defaults to the primitive's own default when omitted.
keyNofind_like only: cell64 to search from. Neighbours are ranked by embedding cosine against this cell.
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.
cellNocell64 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.
typeYesWhich 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).
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.
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.
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.

TDQS

A4.9/5.0
Behavior5/5

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

While annotations already provide idempotentHint=true and destructiveHint=false, the description adds substantial behavioral detail beyond them: the tagged-union semantics, that the plan is executed in the same call, that fields belonging to another intent are ignored, and that an unknown or missing type returns a structured needs_intent_type envelope instead of a hard error. No contradiction with the annotations is present.

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 long but appropriately so for a 14-parameter tagged union with seven modes. It is front-loaded with the core concept, then organized into a compact table, a routing section, and an example. Every section contributes actionable information rather than 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?

Despite having no output schema, the description covers expected outputs per intent in the answers column, explains error-recovery behavior for invalid types, notes how to obtain valid tslots, and provides a runnable example. This is sufficient for an agent to select the tool and construct a correct call for any of the seven intents.

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 schema already provides 100% field coverage with detailed per-parameter descriptions, so the baseline is 3. The description adds value on top by mapping each type to its required versus optional fields, clarifying that only the fields 'its row needs' should be sent, and giving a concrete example. It does not substantially restructure what the schema already says, but it helps the agent navigate the union.

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 clear purpose: 'Say what you want in one typed object and get the answer, without choosing a primitive.' It then enumerates seven distinct intents in a table, each with required fields and expected answers, making it easy to differentiate from sibling primitives like emem_recall and emem_ask.

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?

An explicit 'When to use' section gives both the positive condition ('Call when the question maps onto one of the seven rows above') and the negative routing with named alternatives ('Otherwise go direct: a band at a cell is emem_recall, a region is emem_recall_polygon, a free-text place question is emem_ask'). Additional guidance covers tslot semantics and how to handle tools not in the core list.

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

emem_locateResolve place to cell64 + band inventoryA
Read-onlyIdempotent
Inspect

Mint the canonical, vendor-neutral address (cell64) for a real-world place: the shared spatial identity every agent resolves to identically, so two models refer to the same ground instead of two descriptions of it. Also returns the topic-grouped inventory of bands and algorithms recallable there. For a first-class OBJECT identity (a bridge, a plot, a named place) rather than a raw cell, use emem_entity. Send EITHER lat+lng as numbers OR a free-text place; coordinates win when both arrive. q, query and name are all accepted spellings of place. A key this schema does not declare is reported in _unrecognised_arguments, so a typo answers about somewhere else rather than erroring.

When to use: Call when the input names a real-world place and the next step needs its cell64, or wants to know which bands exist there before recalling. data_at_this_cell carries live_bands_by_topic (every recallable band, grouped by topic), algorithms_for_topic (recipes that fuse them into named scores) and declared_but_no_materializer_at_this_responder. For one packaged answer in a single call, use emem_ask.

Example arguments: {"place":"Mount Everest"}

ParametersJSON Schema
NameRequiredDescriptionDefault
qNoAlias for `place`, accepted because OSM/Mapbox/Google Geocoding all use `q`. Provide either this or `place` (or `lat`+`lng`).
latNoWGS-84 latitude in degrees, paired with `lng`. REQUIRED with `lng` unless `place`/`q` is provided.
lngNoWGS-84 longitude in degrees, paired with `lat`. REQUIRED with `lat` unless `place`/`q` is provided.
nameNoAlias for `place`.
placeNoFree-text place name (e.g. 'Mount Everest', 'Tokyo'). REQUIRED unless `lat`+`lng` is provided. Aliases also accepted: `q`, `query`, `name`.
queryNoAlias for `place`.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, so the safety profile is covered. The description adds valuable behavioral context beyond annotations: the canonical/vendor-neutral nature of the address, the precedence rule ('coordinates win when both arrive'), the alias acceptance, and the '_unrecognised_arguments' behavior for typos. It doesn't describe the full return shape, but the description explicitly mentions the key return fields (live_bands_by_topic, algorithms_for_topic, declared_but_no_materializer_at_this_responder). This is strong behavioral disclosure.

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 dense but well-organized: purpose first, then return-value summary, then disambiguation, then parameter semantics, then when-to-use, then example. Every sentence earns its place, though the opening sentence is long and packs many concepts. The 'When to use' section is clearly front-loaded after the core purpose. Slightly verbose but not wasteful.

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 read-only, idempotent tool with 100% schema coverage and no output schema, the description is quite complete. It explains the core return fields, the input alternatives, the precedence rule, and the error behavior for unrecognized arguments. The only minor gap is that it doesn't describe the exact structure of the cell64 or the full response envelope, but the description explicitly names the key return fields. Given the tool's complexity and the absence of an output schema, this is strong coverage.

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 100%, so the schema already documents all 6 parameters. The description adds meaning beyond the schema by explaining the alias relationship ('q, query and name are all accepted spellings of place'), the precedence rule, and the typo-handling behavior. It also gives a concrete example argument. This exceeds the baseline 3 for full 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?

The description states a specific verb ('Mint the canonical, vendor-neutral address (cell64)') and resource ('real-world place'), and explicitly distinguishes itself from emem_entity ('For a first-class OBJECT identity... use emem_entity'). It also names the sibling emem_ask for a different use case. This is a clear, specific purpose that an agent can act on.

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 gives explicit when-to-use guidance: 'Call when the input names a real-world place and the next step needs its cell64, or wants to know which bands exist there before recalling.' It also names alternatives: emem_entity for object identity, emem_ask for a packaged answer. It even explains the coordinate-vs-place precedence rule. This is exemplary usage guidance.

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

emem_memory_bundleCompose a signed multi-fact memory bundleAInspect

Compose N (cell, band, tslot?) triples into ONE signed envelope. Each triple runs through the standard auto-materialize recall path; the resulting fact_cids are bundled into a content-addressed envelope and the responder signs over the full receipt. The composed bundle_token is emem:bundle:<bundle_cid>, a single rebindable string that cites the whole set. Memory algebra: the merge operation (https://emem.dev/docs/model.html).

When to use: Call when the agent wants to cite multiple (place, band, vintage) facts as one handle. The bundle stays verifiable offline via /v1/verify_receipt (the receipt covers all cited fact_cids and cells). Use this instead of N separate emem_memory_token composers when the citation is conceptually one thing (e.g. "the EUDR-relevant baseline for these 8 plots at 2020-12-31"). Caps at 256 triples per call, and the response reports members and resolved so a bundle that only partly resolved is visible without walking every citation.

Example arguments: {"triples":[{"cell":"defi.zb4d9.pefa.zf619","band":"copdem30m.elevation_mean"},{"cell":"defi.zb493.xoso.zcb6a","band":"indices.ndvi"}],"purpose":"audit baseline 2026"}

ParametersJSON Schema
NameRequiredDescriptionDefault
scopeNoMulti-tenant scope `{user_id, agent_id, run_id, org_id}`, applied to EVERY triple's underlying recall so the whole bundle cites only facts written under that four-tuple.
purposeNoOptional human-readable purpose string. Included in the bundle_cid preimage so the same triples + different purposes produce distinct CIDs.
triplesNoOne to 256 (cell, band, tslot?) triples to bundle. Each entry is recalled through the standard auto-materialize path; the bundle envelope cites every resulting fact_cid. 257 or more is a typed 400: the token is O(1) in size for any N, but covering N facts costs ceil(N/256) calls, so plan round trips rather than meeting the cap mid-run.
fact_cidsNoInstead of triples: the exact facts to bind, by cid. A triple is resolved through recall and can bind a newer fact than the one you showed; a cid binds that fact and no other. Pass triples or fact_cids, not both.

TDQS

A4.6/5.0
Behavior5/5

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

The description discloses the signing/responder behavior, offline verifiability via /v1/verify_receipt, the auto-materialize recall path, O(1) token size with N/256 round trips, and `members`/`resolved` output so partial resolution is visible. This goes well beyond the minimal annotations and does not contradict them.

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 operation, then gives a clear 'When to use' section, constraints, and a representative example. The 'Memory algebra: the merge operation' link is somewhat incidental and unexplained, keeping it from being perfectly economical.

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?

Even without an output schema, the agent learns what the call returns or produces: a bundle_token, a signed receipt covering fact_cids and cells, and `members`/`resolved` fields. Limits, verification path, distinction from alternatives, and an example are all present, so the tool can be invoked correctly without further context.

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%, and the schema already documents `scope`, `purpose`, `triples`, and `fact_cids` including exclusivity, formats, and limits. The description's example arguments are handy but mostly restate schema semantics rather than adding new parameter meaning, so the high-coverage baseline applies.

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 names a specific verb and resource: compose (cell, band, tslot?) triples into one signed envelope and produce an `emem:bundle:<bundle_cid>` token. It also distinguishes itself from the sibling `emem_memory_token` single-fact composer, so an agent can select it 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 Guidelines5/5

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

An explicit 'When to use' section says to call this when multiple facts should be cited as one handle and to prefer it over N separate `emem_memory_token` composers when the citation is conceptually one thing. The 256-triple cap and round-trip planning note provide actionable boundary conditions.

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

emem_memory_contradictionsScan for multi-attester disagreementA
Read-onlyIdempotent
Inspect

Surface where the corpus DISAGREES with itself (algebra: competing evidence). When two or more independent sources signed different values for the same place + band + time, this returns that disagreement with a 0–1 severity score and citations to every disputed fact, instead of silently picking one value and hiding the conflict. The opposite of a confident single answer: it tells you when not to trust one. Read the SCOPE before quoting a zero: by default this asks only whether two DISTINCT attesters disagree, so one responder answering an address from two different upstreams is not counted until you pass include_same_attester_sources: true.

When to use: Call before you rely on a number: 'is there disagreement about X', 'do the sources corroborate this', 'audit this claim'. Narrow with cell_prefix for a region and band for one family; min_severity drops trivial differences. Severity is per band kind: scalar = spread over the band's range, vector = 1 - mean cosine, categorical = 1 - mode share. On a single-responder deployment add include_same_attester_sources: true, because the likeliest real disagreement there is one signer answering from two providers and the default scope cannot report it. Each record names its disagreement_scope. The receipt cites every disputed cid; quantify a pair with emem_diff, or read the disagrees_with edge via emem_edges_recall.

Example arguments: {"cell_prefix":"damO","band":"indices.ndvi","min_severity":0.2}

ParametersJSON Schema
NameRequiredDescriptionDefault
bandNoBand key filter (e.g. `indices.ndvi`). Omit to include all bands.
cellNoAlias for `cell_prefix`, and the spelling the rest of the surface uses for a cell64. Send a cell64 you already hold and the scan narrows to that place instead of running over the corpus.
limitNoMax contradictions to return.
cell64NoAlias for `cell_prefix`.
cell_prefixNoA cell64 to scan, or a bytewise prefix of one (e.g. `defi.zb5f9`). Omit to scan the whole corpus up to the scan cap. A full cell64 is a prefix of itself, so passing one narrows the scan to exactly that place.
min_severityNoSeverity floor in [0, 1]. 0 = report every disagreement, 1 = only flagrant. Severity scoring is per band kind: scalar (max-min over band range), vector (1 - mean cosine), categorical (1 - mode share).
window_unix_sNo[lo, hi] inclusive Unix-seconds filter on attestations' signed_at, all disagreeing attestations must fall in the window.
include_same_attester_sourcesNoAlso report keys where ONE attester answered the same address from two different upstreams. Default false, which scans only for disagreement between two or more DISTINCT attesters — so on a single-responder corpus a zero here means the narrower question was answered, not that nothing disagrees. Set true and a key qualifies when the facts differ in `derivation.fn_key` or in their `sources[].scheme` set; the same provider re-signed is a refresh, not a disagreement, and stays excluded. Each record carries `disagreement_scope` and a `providers[]` list naming what changed.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare read-only and idempotent behavior, so credit goes beyond that use: the description adds the important default-scope caveat ('by default only two DISTINCT attesters'), the meaning of a zero result, severity formulas per band kind, and the existence of disagreement_scope/citations in results. This is valuable context beyond the annotation fields.

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 text is front-loaded with the core purpose, organized into a function—definition block and a 'When to use' block, and ends with a concrete example. It is long but each section carries meaningful instructions; no real filler, though some schema repetition exists.

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?

With no output schema, the description explains what records return (severity, citations, disagreement_scope), specifies severity formula variations, and it refers to what is not covered by a zero. It is sufficiently complete for an agent to know when to call and what to expect.

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 100%, and most parameters already have long descriptions. The description adds usable context such as 'Narrow with cell_prefix and band' and the single-responder purpose of include_same_attester_sources, plus an example, so it does exceed the schema alone, even if some details are repeated.

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 that this tool surfaces corpus self-disagreement with severity scores and citations for competing values, and explicitly contrasts itself with a 'confident single answer' so it is distinguishable from sibling query tools like emem_ask or emem_recall.

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 has an explicit 'When to use' paragraph with example questions and gives concrete guidance on narrowing with cell_prefix/band and on the include_same_attester_sources flag for single-responder deployments. It does not explicitly name an alternative tool for the opposite single-answer case, though it implies it via 'the opposite of a confident single answer'.

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

emem_memory_tokenCompose a memory_token citation handleA
Read-onlyIdempotent
Inspect

Mint a citation handle, emem:fact:<cell64>:<fact_cid> (or :<state_cid>), that any agent or LLM resolves to the byte-identical signed object. The antidote to referential drift on the value side: hand this one string to another agent instead of re-describing the fact. Validates both components are non-empty and free of the : separator. Memory algebra: the cite operation (https://emem.dev/docs/model.html).

When to use: Call when you want one rebindable string to cite a place plus an attested fact across messages, threads, agents or tools. Pair it with emem_echo_verify before you publish the value. FOR MANY FACTS USE emem_memory_bundle INSTEAD, and this is measured rather than stylistic: a token is 83 to 84 characters and 51 LLM tokens while the value it points at averages 11 characters and 5.4, so N tokens cost about 9.5x the context of pasting the N numbers and hit the window sooner. A bundle is 38 characters at any N up to 256 and resolves in one round trip: it wins from N=1 against tokens and from N=5 against the plain values. Individual tokens are for citing ONE fact you must verify later.

Example arguments: {"cell":"defi.zb493.xoso.zcb6a","fact_cid":"cxjiu7l54ujzrpnekp24n4534yojpue4mprddbvevnqtti3lh5bq"}

ParametersJSON Schema
NameRequiredDescriptionDefault
bandNoOptional band key. When set, the minted citation carries the band's tamper-provenance block (class, deterministic, tamper_evidence, trust_rank) so the receiving agent sees the trust class without a resolve round-trip.
cellYescell64, neither component may contain `:`.
fact_cidYes52-char base32-nopad-lowercase content-id of the fact (full 32-byte blake3).
observed_onNoThe fact's source capture date (YYYY-MM-DD) as `/v1/recall` reports it in `sources[].captured_at`. Supplied together with `band` it additionally mints the self-describing `descriptor_token`. A wrong date forges nothing: resolve binds the date to the signed fact and answers 409 on a mismatch.

Output Schema

ParametersJSON Schema
NameRequiredDescription
cellYes
docsNo
grammarNoThe token grammar, so the form can be parsed rather than pattern-matched.
fact_cidYes
cell_tokenNoThe address alone, when you mean the place rather than an observation of it.
memory_tokenYesThe citation to paste: emem:fact:<cell64>:<fact_cid>. Copy it verbatim; a hand-assembled token that is one character wrong still reads as a citation and resolves to nothing.

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds valuable behavioral context beyond annotations: it details validation logic (non-empty, no `:` separator), the resolution semantics (byte-identical signed object), and error behavior (409 on date mismatch). While it doesn't explicitly restate read-only status, it complements annotations with operational details, earning a 4.

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 purpose is front-loaded in the first sentence, followed by usage guidance, a detailed comparison with bundles, and an example. The cost analysis paragraph is longer than strictly necessary but is well-structured and provides decision-relevant data. No superfluous fluff; every sentence serves a function. Slightly long but appropriately organized for an agent to parse.

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?

With an output schema present (context signal says it has one), the description does not need to explain return values. It covers the input purpose, when to use, trade-offs vs. alternatives, validation constraints, and gives a concrete example. For an agent deciding whether to call this tool and how to invoke it correctly, nothing essential is missing. Complete.

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 100% (all 4 parameters have descriptions). The description adds an illustrative example with real-looking values and explains the validation rule that both components must be free of `:`, which is not fully captured in the schema (the pattern for `cell` exists, but `fact_cid` has no such constraint). This supplements the schema notations and provides meaning beyond the basic property descriptions, so a 4 is appropriate.

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 output: it mints a citation handle in the exact format `emem:fact:<cell64>:<fact_cid>` (or `:<state_cid>`). It distinguishes itself from the sibling `emem_memory_bundle` by explicitly noting that individual tokens are for citing ONE fact, while bundles handle many facts. The verb 'Mint' and resource 'citation handle' are clear and unambiguous.

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?

Provides explicit when-to-use: 'Call when you want one rebindable string to cite a place plus an attested fact across messages, threads, agents or tools.' It also states when NOT to use it: 'FOR MANY FACTS USE emem_memory_bundle INSTEAD' with a quantitative comparison of token costs and context overhead. It even recommends pairing with `emem_echo_verify` before publishing. This is model-exemplary usage guidance.

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

emem_memory_token_resolveDereference a memory_token in one round-tripA
Read-onlyIdempotent
Inspect

Parse a emem:fact:<cell64>:<fact_cid> citation handle and return the reading it cites. value, unit, band and kind are on the response at the TOP level, alongside the full signed fact body they were lifted from. Saves the agent from string-splitting the token and chaining GET /v1/facts/<cid> manually. Memory algebra: the resolve operation (https://emem.dev/docs/model.html).

When to use: Call when you hold a memory_token from another agent or an earlier turn and want the value behind it. For a scalar quote value_verbatim, the exact decimal string the fact was signed as: re-typing the JSON number is where measured precision is lost. value and unit are always present, and an explicit null means the fact genuinely has none (an absence has no value; most index bands are dimensionless) rather than a missing field. The response also carries the parsed cell, the fact_cid, the full signed fact and a stable fact_url to hand on. A cid this responder does not hold is a typed 404: try /v1/fetch, or resolve at a mirror.

Example arguments: {"token":"emem:fact:defi.zb493.xoso.zcb6a:cxjiu7l54ujzrpnekp24n4534yojpue4mprddbvevnqtti3lh5bq"}

ParametersJSON Schema
NameRequiredDescriptionDefault
tokenYesA `emem:fact:<cell64>:<fact_cid>` citation handle to dereference.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds valuable behavioral context: the response structure (value, unit, band, kind at top level, full signed fact), the semantics of explicit nulls, the typed 404, and the availability of a stable fact_url. This goes well beyond the annotations and informs the agent of expected outcomes and error handling.

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 longer than strictly necessary but is well-structured: the first sentence states the core purpose, followed by response details, a 'When to use' section, and an example. It is front-loaded with the main action and uses clear sections. While some content (e.g., the doc URL) could be trimmed, the structure makes it easy to scan and the length is justified by the explanatory value.

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?

Despite having no output schema, the description thoroughly explains the response format, including top-level fields (value, unit, band, kind) and the presence of the full signed fact and fact_url. It also covers null semantics and the typed 404 with fallback options. For a single-parameter read-only tool with annotations covering safety, this is complete—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.

Parameters3/5

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

The input schema has 100% description coverage for the single parameter 'token', which already defines it as a 'citation handle to dereference.' The description repeats the format and gives an example argument, but it does not add new semantic meaning to the parameter itself. The extra details about response fields are more about output than input, so the description adds limited value beyond the schema, warranting the baseline score of 3.

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 opens with a specific verb and resource: 'Parse a `emem:fact:<cell64>:<fact_cid>` citation handle and return the reading it cites.' It clearly distinguishes from manual string-splitting and chaining GET /v1/facts/<cid>, and names the operation 'resolve' in memory algebra. The purpose is unambiguous and differentiated from siblings like emem_memory_token.

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 contains an explicit 'When to use' section: 'Call when you hold a memory_token from another agent or an earlier turn and want the value behind it.' It also provides a specific nuance for scalar quotes (value_verbatim to preserve precision) and an alternative for a typed 404: 'try /v1/fetch, or resolve at a mirror.' These are concrete usage conditions and fallbacks, leaving no room for guesswork.

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

emem_recallRecall facts at a cell (auto-materializes on miss)A
Idempotent
Inspect

Read the signed facts at a canonical address (cell64); auto-materializes on a miss for any band with a registered materializer. A fact_cid names one signed attestation, so a recalled fact is citeable and re-verifiable rather than a paraphrase: resolving it anywhere returns those exact bytes. It is NOT a fingerprint of the observation. The digest covers the responder's key and the moment it signed, so two responders that measure the same thing mint different fact_cids and a cid resolves only at the responder that signed it; use emem_entity for identity that crosses responders. Pass deterministic:true (or a provenance class list) to keep only facts recomputable from the cited raw source, with no model or human in the loop. In the memory algebra this is ensure(cell, bands), not get: state what must exist and the responder reuses or materializes.

When to use: Call after emem_locate, or with a known cell64 or place name. Returns every Primary fact at that (cell, band, tslot). If a requested band has no fact yet but has a materializer, the responder fetches the upstream value, signs it, persists it and returns it in the same call (slow once, cached after), so any wired band recalls at any cell on Earth: pass bands: [<band>]. materialize_notes lists what was just fetched; empty with no notes means no materializer here.

Example arguments: {"cell":"damO.zb000.xUti.zde78","bands":["weather.temperature_2m","copdem30m.elevation_mean"]}

ParametersJSON Schema
NameRequiredDescriptionDefault
latNoExplicit latitude, an alternative to `cell`; paired with `lng`.
lngNoExplicit longitude, paired with `lat`.
bandNooptional single band key, convenience alias for bands:[band]. Use when you want exactly one band (e.g. 'geotessera.2020', 'modis.ndvi_mean') and would otherwise have to wrap it in an array. Both `band` and `bands` are accepted; if both are given they are merged.
cellYescell64 string, e.g. 'damO.zb000.xUti.zde78'
bandsNooptional band keys to filter, e.g. ['indices.ndvi','geotessera']
placeNoFree-text place name, an alternative to `cell`.
scopeNoOptional multi-tenant scope {user_id, agent_id, run_id, org_id}. When at least one field is set, the recall is FILTERED to facts written under the same four-tuple (a recall scoped to {user_id:'u1'} sees only u1's facts, never another tenant's and never globally-written facts) AND the signed receipt binds the scope. Omit (or send {}) for the global, pre-v0.0.8 recall.
tslotNooptional time slot (band-tempo-relative integer offset from emem epoch)
cell64NoAlias for `cell`.
includeNoOpt-in response expansion. include:['provenance'] attaches each fact's tamper-provenance class, which is what `deterministic` and the `provenance` filter select ON: without it you can filter by class and never be told which class a returned fact is. include:['freshness'] attaches an advisory per-fact freshness block: a Q(Δt) staleness score from the band's physics decay kernel (the same one /v1/temporal_route ranks bands with), so an agent learns how stale each reading is in the call that returns it. Advisory only; it does NOT enter the receipt. include:['edges'] attaches each fact's typed temporal edges and threads their CIDs into the receipt. Absent leaves the response byte-identical to the pre-v0.0.9 recall.
provenanceNoTamper-provenance filter: return only facts whose band's provenance class is in this list. `attested_execution` is a device reading trusted through its verified OS execution trace and platform attestation (not recomputable). Applied BEFORE the receipt is signed, so the receipt covers exactly the returned facts; `bands_already_attested_at_cell` stays unfiltered so you still see what else exists at the cell.
as_of_tslotNoBi-temporal valid-time bound. Returns the latest fact per (cell,band) whose tslot ≤ as_of_tslot, answers `what did this place look like AS OF date X`. Conflicts with an explicit `tslot` when as_of_tslot < tslot (rejected with code:`invalid_temporal_bound`).
deterministicNoSugar over `provenance`: true keeps only facts any third party can recompute from the cited raw source (direct_sensor + deterministic_index); false keeps the rest (attested_execution + model_output + human_curated + unclassified). Composable with `provenance` (intersection).
as_of_signed_atNoBi-temporal transaction-time bound. RFC 3339 string. Returns only facts whose `signed_at` ≤ as_of_signed_at, answers `what did emem KNOW as of system-date Y`. Malformed strings are rejected with code:`invalid_signed_at_format`.

Output Schema

ParametersJSON Schema
NameRequiredDescription
factsYesSigned facts at the cell, ordered per fact_order.
receiptYesed25519 receipt over the returned fact_cids. Verify offline; select the rule from its preimage_version. Store and forward it byte-for-byte: preimage_version 2 binds every field it covers, including merkle_proof, so a reshaped receipt reports signature_valid:false on data nobody tampered with.
fact_orderYesThe ordering contract for facts, e.g. tslot_ascending. Stated rather than implied so nothing depends on position by accident.
current_by_bandNoPer band, the fact_cid with the highest tslot: the current reading. Unslotted facts are excluded, since tslot 0 means undated rather than oldest.
materialize_notesNo
bands_already_attested_at_cellNoWhat else is readable here without materialising, so an empty result can be told apart from a wrong band name.

TDQS

A4.6/5.0
Behavior5/5

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

The description goes well beyond the annotations. It explains that a miss triggers fetch/sign/persist, that fact_cids are exact bytes rather than fingerprints, that receipts bind scope, and that include options affect response contents. It also discloses bi-temporal boundaries and the advisory freshness block. This is far richer than the readOnlyHint=false and openWorldHint=true annotations alone.

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 long (about 1000 words) but front-loaded: the first sentence states purpose and behavior, followed by nuanced semantics听闻, usage guidance, and example. The structure is clear, though a few sentences repeat schema content and could be trimmed without loss.

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?

All core behaviors are covered: materialization, fact identity, responder-scoped resolution, deterministic/provenance filtering, include expansions, scope, bi-temporal bounds, and example arguments. The output schema handles return-value details, so nothing an agent needs to call or interpret this tool is missing.

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 adds an example argument set and briefly restates deterministic's meaning, but does not introduce new parameter semantics beyond the schema. It offers a concrete usage illustration, but the schema already documents every parameter fully.

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 leads with a specific verb and resource: 'Read the signed facts at a canonical address (cell64)' and immediately adds the key behavior 'auto-materializes on a miss'. It distinguishes itself from emem_entity by explicitly noting 'use emem_entity for identity that crosses responders', and clarifies the semantic as ensure rather than get.

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 gives an explicit 'When to use' section: 'Call after emem_locate, or with a known cell64 or place name.' It also names an alternative for a specific condition ('use emem_entity for identity that crosses responders') and explains the materialization trigger with a practical example ('pass bands: [<band>]').

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

emem_toolsWhat tools exist here, and when to reach for eachA
Read-onlyIdempotent
Inspect

The map of emem's tool surface, and the only tool you need to find the rest: the working loop in the order you walk it (name, ground, cite, resolve, verify, check for drift), then every other tool grouped by the question it answers, each with its one-line trigger. Pass name for one tool's full schema and a runnable example. IF YOU ARE READING A LIST OF 18 TOOLS, YOU ARE SEEING A CURATED SUBSET OF 114, NOT THE WHOLE SURFACE; hosts strip _meta, so the count is repeated here. Every catalogued tool stays callable by name through tools/call at either endpoint.

When to use: Call FIRST when you do not know which tool answers the question, or need a capability absent from your list: absent from the list is not absent from the server. q searches by topic (ndvi, flood, verify), name returns one exact schema, no arguments returns the whole map. /mcp/full registers the full catalog; emem_ask answers in one shot without picking a primitive.

Example arguments: {"q":"ndvi"}

ParametersJSON Schema
NameRequiredDescriptionDefault
qNoFree-text filter over tool names, titles and trigger text, e.g. `ndvi`, `cloud`, `flood`, `verify`, `token`. Plain lowercased substring over name + title + description + trigger text, not fuzzy and not stemmed: `ndvi` hits, `vegetation index` only hits tools that spell that phrase. Combines with `shape`/`bundle`/`category`/`tier` as AND, so an over-narrow combination answers with an empty catalog rather than an error.
nameNoReturn the full descriptor for exactly this tool (input schema, runnable example, annotations), e.g. `emem_ndvi`. Use this when you already know the name and want its schema without loading the whole catalog. It SHORT-CIRCUITS: when `name` is set every other argument here is ignored, so `{name, q}` is not a search within one tool. A name this responder does not carry is not an error status, you get a body with `did_you_mean` holding up to five names that share a substring with what you asked for.
tierNoWhich slice to list. Defaults to `all`, so this tool shows the whole surface even when the endpoint advertises only the core loop, and an `extended` tool you find here is callable by name through tools/call whether or not your host listed it. Pass `core` to see only what a default connection advertises.
shapeNoFilter by what the answer looks like, which is usually the real question. `scalar` is one number at one address; `raster` is a gridded field over an area; `timeseries` is a value per timestep; `vector` is a learned embedding; `identity` is a canonical name for a thing; `token` is a citation handle; `proof` checks one.
bundleNoFilter by the job you are doing. Call with no arguments first to see each bundle and its size.
categoryNoFilter to one category. This is about the shape of the job, NOT about safety: 16 tools outside `write` declare `readOnlyHint: false` because reading a cold address can materialise or mint as a side effect, so `category: "read"` is not a safe-tools filter. Read each result's `annotations.readOnlyHint` for that.

TDQS

A4.9/5.0
Behavior5/5

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

Beyond the annotations, the description discloses that hosts strip `_meta`, that a visible list of 18 tools is only a curated subset of 114, that all catalogued tools remain callable via tools/call, and that `name` short-circuits other arguments. These are behavioral traits that the annotations alone do not convey. No contradiction with readOnlyHint, idempotentHint, or destructiveHint is present.

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 long but densely packed and well structured: identity and role come first, then the working-loop ordering, grouping logic, retrieval behavior, and a dedicated "When to use" section. The all-caps subset warning and example arguments each carry operational information that is not redundant with the schema.

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 zero-required-parameter introspection tool with a rich schema and no output schema, the description covers everything needed: no-arg behavior, q/name entry points, tier filtering, the return shape as a question-grouped map with one-line triggers, and the fallback path via tools/call. An agent can decide whether and how to call this tool without further information.

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 input schema already provides 100% descriptive coverage of all six parameters, so the baseline is 3. The description adds the no-arguments "whole map" behavior and a concrete runnable example ({"q":"ndvi"}), which are useful, but it does not need to compensate for a schema gap. It adds meaning without being the primary source of parameter understanding.

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 names the tool as "the map of emem's tool surface" and "the only tool you need to find the rest," making its catalog-discovery role explicit. It also distinguishes itself from siblings such as emem_ask, which "answers in one shot without picking a primitive." This is a specific verb-plus-resource description, not a tautology or vague label.

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?

There is an explicit "When to use" block instructing the agent to call this tool FIRST when it does not know which tool answers or needs a capability absent from its current list. It also names alternatives: /mcp/full for registering the full catalog and emem_ask for one-shot answers, plus the `name` parameter for when the agent already knows the exact tool.

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

emem_verify_receiptServer-side ed25519 receipt verifierA
Read-onlyIdempotent
Inspect

Verify a signed receipt envelope server-side: rebuilds the canonical preimage under the rule the receipt's own preimage_version names, runs ed25519 over the embedded key and signature, and returns {valid, reason, failure_detail, signature_valid, merkle_proof_valid, signer_pubkey_b32, preimage_blake3_hex}. A receipt is BYTE-FOR-BYTE OR NOTHING: v2 binds the inclusion proof, so any reshaping (a dropped field, a re-keyed one, a summary) invalidates the signature by design. For when the in-browser /verify path is unavailable, or for a server-side audit of a third party's receipt.

When to use: Pass the receipt EXACTLY as the read primitive returned it, whole and unmodified. Two omissions produce a false forgery rather than a 400, and they are the only two worth memorising: dropping merkle_proof, and dropping preimage_version (absent deserialises to 0, which silently selects the v0 rule, so the proof still walks while the signature reads as invalid). Signature and pubkey may be byte arrays or sig_b32 / responder_pubkey_b32; no other spelling is tolerated. Reshaping a field this responder can check is reported as reason: receipt_reshaped_after_signing with the field named, never accepted. Optionally set pubkey_b32 to assert a specific signer. A bad signature is 200 with valid: false, never a 4xx. The example arguments are a real receipt this responder signed (key epoch 0) over one weather fact at Trafalgar Square: run it unchanged and valid is true; change any byte and it is not.

Example arguments: 1602 bytes, too long to inline in a listing. Call emem_tools with {"name": "emem_verify_receipt"} for it whole and runnable; it is not shortened here because a truncated example is not one.

ParametersJSON Schema
NameRequiredDescriptionDefault
factsNoThe fact value(s) you intend to rely on. Each is content-addressed and checked for membership in the receipt's `fact_cids`, so a genuine receipt presented beside a tampered fact answers `valid:false` / `fact_mismatch`. Omit it and only the signature is checked, which a doctored fact survives.
receiptYesThe signed receipt envelope, the object under `receipt` in any read primitive's result. Must carry primitive/served_at/request_id/cells/fact_cids and either `signature` byte[] + `responder_pubkey` byte[] or their b32 string forms. IF ALL YOU HOLD IS AN `emem:fact:` TOKEN, this is not the tool to call first: a token is not a receipt and passing one here is a shape error. Call `emem_memory_token_resolve` on the token, then pass THAT result's `receipt` object here. Resolving proves the token points at the bytes it claims; verifying proves this responder signed them.
pubkey_b32NoOptional explicit responder pubkey (base32). When omitted, uses the receipt's embedded pubkey/responder fields.
current_responder_epochNoThe responder key epoch you currently trust, from `/v1/manifests`. Produces an advisory `key_epoch_advisory` comparison against the receipt's epoch; a mismatch is reported, never rejected.

TDQS

A5/5.0
Behavior5/5

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

Annotations declare readOnly/idempotent/non-destructive, and the description adds critical behavioral detail beyond that: byte-for-byte binding, v2 inclusion proof invalidation on reshaping, the two omissions that produce false forgery rather than a 400, and bad signatures returning 200 with valid:false. No contradiction with annotations.

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?

Long but dense and front-loaded: the first sentence gives the operation and output contract, and each subsequent paragraph carries a distinct warning, routing rule, or example note. No filler; the length is appropriate for a security-critical verifier with subtle failure modes.

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?

No output schema exists, so the description supplies the full return shape and valid:false semantics. It covers all four parameters, the critical false-forgery cases, the alternative token-resolution path, and even how to obtain a runnable example. Nothing an agent needs to invoke this 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 coverage is 100%, so the baseline is 3, but the description adds substantial semantics beyond the schema: consequences of omitting facts, exact accepted spellings for signature/pubkey fields, the merkle_proof and preimage_version failure modes, and the advisory nature of current_responder_epoch. This lifts it well above baseline.

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: 'Verify a signed receipt envelope server-side', then enumerates the exact verification steps and return fields. It also distinguishes itself from the sibling emem_memory_token_resolve by explicitly saying a token is not a receipt and from the in-browser /verify path, so an agent can select it correctly.

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?

Contains an explicit 'When to use' section naming the in-browser /verify path and server-side audit use cases, plus an explicit when-not: if all you hold is an emem:fact token, call emem_memory_token_resolve first. This gives clear routing among alternatives.

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

fetchOpen one search result and read the signed recordA
Idempotent
Inspect

Dereference an id from search: the reading in one line, then the signed body it came from, the URL serving those bytes, and metadata naming cell, band, signing time and key. Takes an emem:fact: citation, a bare fact_cid, or an emem:cell: handle for a whole cell. The value is quoted as the exact decimal string it was signed as, never re-rendered. A fact handle writes nothing; a cell handle, like emem_recall, MATERIALIZES a missing band on a cold cell (fetched upstream, signed, persisted), so the flags follow that path: readOnlyHint false.

When to use: Call on each result you intend to cite, before quoting the number. Quote the one-line reading; the body makes it checkable, and emem_echo_verify grades what you emit against it. An oversize body says so inline and names the URL serving it whole.

Example arguments: {"id":"emem:fact:defi.zb493.xoso.zcb6a:cxjiu7l54ujzrpnekp24n4534yojpue4mprddbvevnqtti3lh5bq"}

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesAn id from `search`: an `emem:fact:` citation, a bare fact_cid, or an `emem:cell:` handle for every fact at one cell.

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYesEchoed id, in canonical form.
urlYesStable URL serving these bytes.
textYesThe reading in one line, then the signed body it was lifted from. If the body was too large for the wire it says so inline, with the URL that serves it whole.
titleYesWhat this record is.
metadataNocell, band, when it was signed and by which key: the fields a reader needs to judge the citation without re-fetching it.

TDQS

A5/5.0
Behavior5/5

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

Goes well beyond annotations: it explains the readOnlyHint=false flag by disclosing that cell handles can MATERIALIZE a missing band (fetched upstream, signed, persisted), while fact handles write nothing. It also reveals exact-decimal quoting, never re-rendering, and inline oversize-body behavior. No contradiction with annotations.

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?

Front-loaded with the core purpose, then compactly covers usage, side effects, and an example. Every sentence earns its place; no filler or repetition of the title or schema. The length is justified by the tool's behavioral complexity.

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?

With an output schema present, the description appropriately focuses on selection and invocation semantics. It covers the id format, the effect of each handle type, when to call it, what to quote, and how oversize bodies are reported. Nothing needed for correct invocation 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?

Even though schema coverage is 100%, the description adds substantial meaning beyond the schema: it explains the three accepted id forms and the behavioral difference between fact and cell handles, including the write path. This directly helps an agent choose the correct argument form and anticipate side effects.

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 ('Dereference'), the exact resource (an id from search), and the returned components (reading, signed body, URL, metadata). It clearly differentiates itself from search (which lists results) and from emem_recall/emem_echo_verify by naming them and describing its distinct role.

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 says when to call it: 'Call on each result you intend to cite, before quoting the number.' It also gives the alternative context by distinguishing fact handles (writes nothing) from cell handles (materializes like emem_recall) and references emem_echo_verify for verification.

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

Related MCP Connectors

Related MCP Servers

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.