Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, get in touch and we’ll put it right.

emem, the verifiable memory protocol for the physical world

REMOTE · EMEM.DEV · 2 COMPONENTS

Shared, verifiable memory for machines and AI. Encode where data lives; decode with any AI.

0 this week 87 Trust /100

Last scanned (27 minutes ago)

Scores higher than 94% of remote servers

Reachable. Last reached 5 Nov 2026.

Category Memory and Knowledge

Trust breakdown (7 categories)

How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. How we score → Why this is hard to score →

Endpoint Security80
Transport & Reachability100
Schema Quality & AI Usability75
  • 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).Pass
  • AI-judged instruction clarity (excellent).Pass
  • Context-footprint check failed: tool/resource definitions use about 12916 tokens (~331/item across 39 items; 18 tools + 21 resources), over budget; trim descriptions and params. See how to fix → Fail
  • Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management100
  • No destabilizing schema changes in the last 30 days.Pass
Tool Coverage99
  • 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
  • 97% of tool parameters carry a description.Partial
  • Structured output schemas are declared (50% of tools); any adoption earns full credit.Pass
Tool Safety100
  • No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
  • We read all 18 captured tool definition(s), and no name or description among them implies an irreversible operation.Pass
  • An AI judge read all 20 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
  • Implements a current MCP spec version (2026-07-28).Pass
  • Supports UI / widget rendering.Pass
Changelog

Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.

  • 25 Oct 26 0
    • The server rewrote its instructions, which are the text every model session reads security
    • Tool “emem_ask” rewrote its description, which is the text the model reads security
    • Tool “emem_tools” rewrote its description, which is the text the model reads security
    • Tool “emem_locate” rewrote its description, which is the text the model reads security
  • 18 Oct 26 0
    • Server version: 2.4.3 → 2.4.4 functional
  • 12 Oct 26 −1
    • The server rewrote its instructions, which are the text every model session reads security
    • Tool “emem_ask” rewrote its description, which is the text the model reads security
    • Tool “emem_echo_verify” rewrote its description, which is the text the model reads security
    • Tool “emem_entity” rewrote its description, which is the text the model reads security
    • Tool “emem_entity_link” rewrote its description, which is the text the model reads security
    • Tool “emem_entity_resolve” rewrote its description, which is the text the model reads security
    • Tool “emem_find_similar” rewrote its description, which is the text the model reads security
    • Tool “emem_guard_verdict” rewrote its description, which is the text the model reads security
    • Tool “emem_intent” rewrote its description, which is the text the model reads security
    • Tool “emem_locate” rewrote its description, which is the text the model reads security
    • Tool “emem_memory_bundle” rewrote its description, which is the text the model reads security
    • Tool “emem_memory_contradictions” rewrote its description, which is the text the model reads security
    • Tool “emem_memory_token” rewrote its description, which is the text the model reads security
    • Tool “emem_memory_token_resolve” rewrote its description, which is the text the model reads security
    • Tool “emem_recall” rewrote its description, which is the text the model reads security
    • Tool “emem_tools” rewrote its description, which is the text the model reads security
    • Tool “emem_verify_receipt” rewrote its description, which is the text the model reads security
    • Tool “fetch” rewrote its description, which is the text the model reads security
    • Tool “search” rewrote its description, which is the text the model reads security
    • Server version: 2.4.2 → 2.4.3 functional
    • “emem_intent” added an optional parameter “areas” cosmetic
    • “emem_intent” reworded the description of “k” cosmetic
    • “emem_intent” reworded the description of “key” cosmetic
  • 10 Oct 26 0
    • The server rewrote its instructions, which are the text every model session reads security
    • Tool “emem_tools” rewrote its description, which is the text the model reads security
    • Tool “emem_intent” rewrote its description, which is the text the model reads security
    • MCP protocol: Implements a current MCP spec version (2026-07-28). functional
    • MCP protocol version: 2025-11-25 → 2026-07-28 functional
    • “emem_intent” added an optional parameter “start_date” cosmetic
    • “emem_intent” added an optional parameter “bbox” cosmetic
    • “emem_intent” added an optional parameter “end_date” cosmetic
    • “emem_intent” added an optional parameter “geometry” cosmetic
    • “emem_intent” added an optional parameter “index” cosmetic
    • “emem_intent” added an optional parameter “max_scenes” cosmetic
    • “emem_tools” reworded the description of “category” cosmetic
    • “emem_intent” reworded the description of “type” cosmetic
  • 1 Oct 26 88
    • Tool “emem_memory_token_resolve” rewrote its description, which is the text the model reads security
    • Tool “emem_locate” rewrote its description, which is the text the model reads security
    • Tool “emem_intent” rewrote its description, which is the text the model reads security
    • Tool “emem_verify_receipt” rewrote its description, which is the text the model reads security
    • Tool “search” rewrote its description, which is the text the model reads security
    • Tool coverage: 39% → 50% ▲ functional
    • Tool “emem_locate” now declares an output schema ▲ functional
    • Tool “emem_memory_token_resolve” now declares an output schema ▲ functional
    • “emem_intent” reworded the description of “type” cosmetic
    • “search” reworded the description of “query” cosmetic
  • 29 Sept 26 0
    • Judged manipulation: unverified → pass ▲ security
    • The server rewrote its instructions, which are the text every model session reads security
    • Tool “emem_guard_verdict” rewrote its description, which is the text the model reads security
    • Tool “emem_intent” rewrote its description, which is the text the model reads security
    • Tool “emem_recall” rewrote its description, which is the text the model reads security
    • Tool “search” rewrote its description, which is the text the model reads security
    • Tool “emem_verify_receipt” rewrote its description, which is the text the model reads security
    • Tool “emem_ask” rewrote its description, which is the text the model reads security
    • Tool “emem_find_similar” rewrote its description, which is the text the model reads security
    • Schema quality: unverified → excellent ▲ functional
    • Server version: 2.4.0 → 2.4.2 functional
    • “emem_entity” added an optional parameter “attester” cosmetic
    • “emem_entity_link” added an optional parameter “attester” cosmetic
    • “emem_intent” reworded the description of “cell” cosmetic
    • “emem_recall” reworded the description of “cell” cosmetic
    • “emem_tools” reworded the description of “category” cosmetic
    • “emem_ask” reworded the description of “include” cosmetic
    • “emem_ask” reworded the description of “model” cosmetic
    • “emem_ask” reworded the description of “verbose” cosmetic
  • 28 Sept 26 0
    • We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
  • 27 Sept 26 0
    • Tool “emem_guard_verdict” rewrote its description, which is the text the model reads security
Diagnostics

Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.

Captured 5 Nov 2026 · Probed https://emem.dev/mcp

TLS valid

Negotiated TLS 1.3 with TLS_AES_128_GCM_SHA256 .

Subject Issuer Valid from Valid until Key Signature Serial
CN=emem.dev CN=YE2,O=Let's Encrypt,C=US 14 Sept 2026 13 Dec 2026 ECDSA 256 ECDSA-SHA384 5bdde4edc992cc025dcf06f04bf11a3bcb4
SANs: emem.dev, www.emem.dev
CN=YE2,O=Let's Encrypt,C=US (CA) CN=Root YE,O=ISRG,C=US 3 Sept 2025 2 Sept 2028 ECDSA 384 ECDSA-SHA384 4df3b15dd6c0784c507cd37b58e6f115
CN=Root YE,O=ISRG,C=US (CA) CN=ISRG Root X2,O=Internet Security Research Group,C=US 13 May 2026 2 Sept 2032 ECDSA 384 ECDSA-SHA384 872165fc34b6e5fba8add5b3705fb53a
CN=ISRG Root X2,O=Internet Security Research Group,C=US (CA) CN=ISRG Root X1,O=Internet Security Research Group,C=US 13 May 2026 2 Sept 2032 ECDSA 384 SHA256-RSA 6c8f1dc727c7117f7baf853ac980f9cd

Background: What to check on a remote MCP endpoint →

DNSSEC insecure

Validation of emem.dev. — Not signed

Zone DS Keys Algorithms Outcome
. trust_anchor 20326, 38696 8, 8 Verified
dev. present 60074 8 Verified
emem.dev. absent Unsigned (proven) parent-signed NSEC/NSEC3 proves an unsigned delegation
Authentication No authorisation required

The endpoint answered without asking for a token. Anyone who knows the URL can reach it.

Result No authorisation required
HTTP status 200
Header Value
strict-transport-security max-age=31536000; includeSubDomains; preload
content-security-policy default-src 'self'; script-src 'self' https://esm.sh https://cdn.redocly.com 'sha256-/OZLS1iGQfZpkImqUyvg0teIMkPzv4PP5C/Z6Z0wDKo=' 'sha256-2y3yiWbrjGr8Wz5X4vE1qv3DoKLY3LBbN+dSHuOfseY=' 'sha256-5Dll0YU9/f+fskyt76Iy/1AaSt71ltIW/kb5yeg2vYo=' 'sha256-5drXHcFDsHyX/M9ryszbgZHB7YSCe55jIHn/02mKXPw=' 'sha256-6PPJxOwlYAoeAeKFH5Z3sm+lprTV/WF4rUVVj9ScXiU=' 'sha256-73oaB4fVwby1mAgJg2dmBuSeLtdyG5rcaXjqhAzDNVI=' 'sha256-8Lom3QkcsuIFvPIKEbHsKM6V22SuVGbXElWqsFp/mOc=' 'sha256-8vnQX7+vHcAt3ELB02aOu4MJIM+256eIdW2+xkLr5ac=' 'sha256-9E1E4k85S/LzKdqqAajv9LyRK7kmLjowBmm4Kpskxp8=' 'sha256-9V8sfKVUa3HErPFhvJKvWXdRW2iGkHvKF/AQyid9POk=' 'sha256-A9sTUR9JMB7epNg8zpm0I52ZeCvIwPpzMAjtB5e1qCE=' 'sha256-BC3kmFRQjI7i3nY+wYMTbt65j6ljlx+ZN433t/kignI=' 'sha256-BuChz52GVMz8nc76A+SoFZTTc+l8J0PvArPG3PF9GAE=' 'sha256-D18y043mO+yptyU9fUFvoFL8ZhV2+JbGm/GzXbHoER8=' 'sha256-F5SQGr21Jv0wi8LLaSwAxMh6PFpoLIf4A3/z32FD1S8=' 'sha256-FcwzQ4Zk3fjAMbwCZak+dp5n5apHticz8COqhQoVX88=' 'sha256-HF7X5WdR7qqWdYPcAvGC7o3aMOD9lmoh4N8U56z6Ml4=' 'sha256-J86/ob8AkVFGaSMikEpc3
x-content-type-options nosniff
referrer-policy strict-origin-when-cross-origin
permissions-policy geolocation=(), microphone=(), camera=()

Background: How OAuth 2.1 works in the 2026 MCP spec →

Transports 2 probes
Transport URL Outcome Status Location
streamable-http https://emem.dev/mcp Verified 200
http (plaintext) http://emem.dev/mcp HTTPS enforced
MCP tools · 18 exposed · ~11,062 tokens

The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →

Tool Tokens
emem_ask ~819

Answer a free-text question about a real-world location in one call. Signed satellite, elevation, water and built-up receipts support the answer. The tool sends the place and the question through the locate, recall and algorithm chain on the server, and returns one packaged envelope. When to use: Call this when the question is about a specific place and the answer must carry its evidence. Send the question as `q`, with `place`, `cell` or `lat`+`lng`. Over MCP a point answer is a projection. It has `answer`, `receipt` (cite `receipt.fact_cids`), `place_resolved`, `routed_to`, `facts_summary`, `algorithm_outcomes_summary`, `spatial_trace` and `scene_url`. It has `model_answer` if you sent `model`, and `_projection`, which names what the projection removed. It has `research_nearby` when vouched research agents signed conclusions inside the place. Those are pointers only; read them with emem_inferences. POST /v1/ask has more: `caveats`, `topic_routing`, `reasoning`, and `inventory` with include:["inventory"]. A `routed_to` other than answer comes back complete. The answer gives a current value. For how X changed, use emem_intent did_change or emem_diff. Example arguments: {"q":"is this neighbourhood flood-prone for a flat purchase","place":"Ashok Nagar, Ranchi"}

NameTypeReqDescription
cellstring–cell64 string (alternative to `place`, use when you have one from a prior emem_locate / emem_recall response). Provide this OR `place` OR `lat`+`lng`.
includearray–Opt-in REST envelope sections. `reasoning` drops `algorithms_for_question`; add `algorithms` to keep it. The MCP projection ignores these.
include_imageboolean–Bundle a Sentinel-2 RGB scene URL for the resolved cell. Adds ~1-2 s on first call.
latnumber–WGS-84 latitude (paired with `lng`; alternative to `place` / `cell`).
lngnumber–WGS-84 longitude (paired with `lat`).
modelstring–Optional. Compose an EXTRA prose answer with a named model, returned as `model_answer` beside the deterministic `answer`. It does not replace it: `answer` is synthesised from the structured fields an…
placestring–Free-text place name (e.g. "Mount Fuji", "Ashok Nagar, Ranchi"). REQUIRED unless `cell` or `lat`+`lng` is provided. Extract the noun phrase from the user's turn; the responder geocodes via OSM Nomina…
qstringyesUser's natural-language question about the place (e.g. "is this neighbourhood flood-prone").
querystring–Alias for `q`.
questionstring–Alias for `q`.
verboseboolean–REST only: true adds per-algorithm formulas, band metadata and long prose. The MCP projection is small (about 7 KB) either way; the REST envelope is larger.
NameTypeReqDescription
_meansstring––
answerstring–The prose answer. Also in the content block, which carries the MCP projection; POST /v1/ask has the full envelope.
cellstring–The cell64 the question resolved to: emem's address for the place.
questionstring–The question as asked.
schemastringyes–
spatial_traceobjectyesA 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.

No examples provided.

emem_echo_verify ~624

Grade a value that you will emit against the signed fact that your citation cites. The tool returns `matches`. When the value does not match, it also returns the `drift` between your value and the value in emem. This step catches a transcription error that would otherwise be a silent wrong number. A model can resolve a fact correctly and still type `0.2411` for `0.241103`. No other step in the loop sees this. Memory algebra: the `verify` operation (https://emem.dev/docs/model.html). When to use: Call this immediately before you publish, log or pass on a value from an emem fact. Treat a false `matches` as a stop, not a warning. Use `value_verbatim` from resolve: quote that exact decimal string, then echo-verify the text you emitted. For a due-diligence or compliance record, this gives a signed check for each citation. Then you can state `every cited value was echo-verified`. The tool also accepts a bare cid, so a damaged citation still gets a grade. Example arguments: {"token":"emem:fact:defi.zb572.xoso.zb1ec:4qj3l4mgh7ch5kvxmkqspjdl6y42oqhm42khh3gostccpixkbz5q","claimed_value":"-0.0522"}

NameTypeReqDescription
claimed_valuestring|numberyesThe 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…
strictboolean–Require 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 ca…
tokenstringyesThe 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 t…
NameTypeReqDescription
canonical_tokenstring–The token in its canonical spelling, whatever form you passed.
claimed_valuestringyesEchoed back, so a log line carries both sides of the comparison.
degradedboolean–True when a bare cid was passed and the cell binding could not be checked.
driftstring|null–The 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. Dec…
fact_cidstring––
matchesbooleanyesWhether what you were about to publish agrees with the signed fact. Treat false as a gate, not a warning.
offline_verify_atstring–Where to re-run this check without trusting this responder.
receiptobject––
resolved_value_verbatimstring–The fact's value as the exact decimal string it was signed as. Quote this rather than reformatting it.
tokenstringyesThe citation you passed, echoed back exactly as sent.

No examples provided.

emem_entity ~554

Give a real-world object (a bridge, a farm plot, a river, a named place) one shared identity. Every agent resolves this identity the same way. The result is an `entity_token` (`emem:entity:<entity_cid>`) and a signed receipt that shows how the reference resolved. Two agents that name the same object get the SAME entity_cid. A stable external id (Overture GERS or OSM) decides identity when the responder knows one, so different labels for one object collapse to one id. This stops referential drift: 'the damaged bridge near the river' becomes one thing that every model reasons about. When to use: Call this when a conversation refers to a THING and you need a handle that travels between agents. Anchor it with `place`, `cell` or `lat`+`lng`. Give the `emem:entity:` token to a peer, and the peer gets the same object. Recall at its cell64 to read signed facts. Choose the correct sibling: this tool MINTS or returns an identity. `emem_entity_resolve` finds an identity that an agent registered before, from a fuzzy phrase. `emem_entity_link` records that two names mean one object. Do not use it for an observation (use emem_recall or emem_memory_token) or for a place (use emem_locate). An entity is a thing AT a place. Example arguments: {"label":"Golden Gate Bridge","kind":"bridge","place":"Golden Gate Bridge, San Francisco"}

NameTypeReqDescription
attesterobject–ed25519 binding, verified. Omit it and the refusal's details.how_to_sign gives the digest to sign.
cellstring–cell64 to anchor the object directly (no geocode).
external_idsobject–Stable ids that drive convergence. Caller-supplied values win over geocoder-derived ones.
kindstring–Object class: bridge, river, farm_plot, building, admin_division, place, custom, ... Defaults to "place".
labelstringyesHuman name of the object, e.g. "Golden Gate Bridge", "the north dam". Required.
latnumber–Latitude 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.
lngnumber–Longitude, paired with lat.
parentstring–Optional parent entity_cid (containment).
placestring–Free-text place to anchor the object (geocoded). Provide place OR cell OR lat+lng.

No output schema declared.

No examples provided.

emem_entity_link ~394

Record a signed, ATTRIBUTED claim that a label or an external id (GERS, OSM, Wikidata) names an existing object. With `stance: "disputes"`, record that it does not. This is a write to the shared space: it changes what other agents resolve. The responder stores it with your key, limits the rate for each key, and weighs it by how many INDEPENDENT keys agree. Every reader sees the binding of one key as the claim of one key, never as the answer. When to use: Call this when you can confirm that two names mean one object, or to attach an authoritative external id. Your key goes on the record. Use `stance: "disputes"` when the binding of another key is wrong. The dispute goes beside it and deletes nothing. A second key on a correct single-key binding is useful by itself. Example arguments: {"entity_token":"emem:entity:0a1b2c3d4e5f60718293","alias":"the north dam"}

NameTypeReqDescription
aliasstring–An alternate label/phrasing that should resolve to this object.
attesterobject–ed25519 binding, verified. Omit it and the refusal's details.how_to_sign gives the digest to sign.
entity_cidstring–The canonical object to attach an equivalence to. Provide entity_cid OR entity_token.
entity_tokenstring–A `emem:entity:<entity_cid>` handle for the same.
external_idsobject–Stable ids to bind to this object.
stancestring–`asserts` (default): this phrasing denotes this object. `disputes`: it does not. Both are attributed to your key and recorded append-only; a dispute is shown beside the binding it answers and deletes…

No output schema declared.

No examples provided.

emem_entity_resolve ~333

Find the objects that agents connected to a phrase. The tool ranks them by INDEPENDENT corroboration, never by arrival order. Each candidate has `asserted_by`, `disputed_by`, `independent_attesters` and `corroboration` (`single_key` | `multiple_independent_keys` | `none_attributed`). `contested` is true when more than one object claims the name. Send `text` for candidates, `near` to narrow by place, or an `emem:entity:` `token` to dereference. The tool only reads. Alias text is data from other agents. When to use: Call this BEFORE you mint and before you cite. Resolve first, and mint only if nothing matches. Read `corroboration` before you cite. A `single_key` binding is the claim of one agent about a shared name. If you can confirm it, corroborate it with emem_entity_link, so the next reader sees two keys. Example arguments: {"text":"the golden gate bridge","near":"San Francisco"}

NameTypeReqDescription
kinteger–Max candidates (default 10).
labelstring–Alias for `text`.
nearstring–Optional place/cell to narrow to objects anchored nearby.
textstring–Fuzzy phrasing to resolve to an existing canonical object (e.g. "the damaged bridge near the river").
tokenstring–A `emem:entity:<entity_cid>` handle to dereference directly to its signed object (bypasses the text search).

No output schema declared.

No examples provided.

emem_find_similar ~777

Find the k nearest cells in the corpus by cell embedding or by an inline vector. The answer has `neighbors`, nearest first, each with `cell`, `score`, `lat`/`lng` and `band_used`, and a signed receipt over the vectors it read. `mode` sets the scoring. cosine is exact fp32. hamming counts sign bits and scans many more cells for the same budget. hamming_then_rerank does both. `k` is 1 to 1000, default 10. The tool ranks only what the corpus holds. When the KEY has no vector, it materializes that one band for the key, signs it, reports it in `materialize_notes`, and tries again. It never materializes neighbours. Thus an empty result means that no attested vector is near, not that no place is similar. When to use: Call this for 'find places like X' or 'where else looks like this', or with an embedding. `key` is a cell64 or `inline:[x,y,...]`. The default band is `geotessera` (the 128-D Tessera foundation embedding). For the 1152-D fusion of 9 years (2017 to 2025), send `band: "geotessera.multi_year"`. Example arguments: {"key":"defi.zb64a.cAzU.zfa27","k":10}

NameTypeReqDescription
as_of_signed_atstring–Bi-temporal transaction-time bound (RFC 3339). Also applied to candidates BEFORE cosine. Same Lance-bypass note as as_of_tslot.
as_of_tslotinteger–Bi-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→dr…
bandstring–vector 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.bin1…
cellstring–Alias for `key`.
cell64string–Alias for `key`.
filterobject–Claim-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…
kinteger–How many neighbours to return.
keystringyescell64 (look up that cell's vector) or 'inline:[x,y,...]' literal vector
modestring–Scoring 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 = t…
scopeobject–Multi-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 fil…

No output schema declared.

No examples provided.

emem_guard_verdict ~849

Run the emem-guard policy checks on text before you send it. The checks use this responder's corpus. The tool finds every emem: citation, resolves each one, and returns allow or deny with a reason that a machine can read: `EMEM-GUARD DENY <CODE> token=<token|-> fix=<fix> leaf=<leaf|->`. The codes are: PROV_SIG (the signature did not verify). PROV_BYTES (the citation resolved to different content). PROV_DRIFT (the reading moved past its band threshold). PROV_VALUE (a stated value does not agree with the cited fact). CLAIM_UNGROUNDED (a measurable claim has no citation; turn it on with claim_gating). `fix` tells you what to do: refresh_token, remove_reference, contact_admin, cite_observation, correct_value. Only a self-hosted guard returns GEO_ZONE and redact_and_retry. This tool is ADVISORY: it blocks nothing. A citation that this responder does not hold is never a denial, because it can be a citation from another responder. Memory algebra: the `verify` operation (https://emem.dev/docs/model.html). When to use: Call it on your draft before you assert something, or on a tool result before you reason on it. Then you can fix a citation that does not resolve. With `claim_gating: true`, it also names measurable claims with no citation, and the band that answers each. For a payload from another framework (CloudEvent, OPA input, OpenAI moderations body, a tool call from another server), send it unchanged and name its `shape`. The default reader reads only `texts`, and a check that read nothing answers allow. To ENFORCE the policy, use emem_guard_selfhost. It returns the procedure for your own node. Example arguments: {"texts":["Lusail ground sits at 2.6 m per emem:fact:defi.zb521.jawI.gOze:f3yr3urkrfwamlemwadulgth2qpw645vi6l6fhtuu4dy5o7onahq"]}

NameTypeReqDescription
agentstring–Optional free-text label for who is asking. Advisory only, never a trust boundary.
claim_gatingboolean–Also 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 c…
shapestring–Which 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 tool…
textsarray–Free 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…
NameTypeReqDescription
actionstringyesNOT 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.
advisorybooleanyesTrue on the hosted route, where nothing is blocked. Run your own node to enforce.
checkedintegeryesHow many were actually resolved, bounded by the verdict budget.
citationsarray–Each citation and what it came to here: verified, signature_failed, byte_mismatch, not_held_here (minted elsewhere or nonexistent: resolve it where it was minted before relying on it), or drifted.
citations_foundintegeryesHow 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.
citations_verified_hereinteger–How many of the citations this responder holds and verified.
claimobject–On 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.
codestring–Present only on a deny.
fixstring–The actionable half: what to change and retry.
receiptobjectyesed25519 receipt. `fact_cids` lists what actually resolved and is the field that separates a real citation from an invented one.

No examples provided.

emem_intent ~1,034

State what you want in one typed object and get the answer. You do not choose a primitive. `type` selects the intent AND the other fields that the tool reads. Send only the fields in its row. The plan runs in the same call: you get results, not a list of calls. type | needs | optional | answers where_is | description | | cell64 for a named place what_is_here | cell OR place | description | what is attested at a location is_like | a, b | | cosine similarity of two cells did_change | cell, band, window | | delta for one band over [start,end] tslots find_like | key | k, filter | nearest cells by embedding confirm | claim, cell | | verdict and the signed facts behind it ask | description | place/cell/lat+lng | free-text question, packaged answer area_over_time | geometry, bbox OR areas; start_date, end_date | index, max_scenes | index of an area for each overpass, with spread and anomaly An unknown or missing `type` returns a `needs_intent_type` envelope with the valid values. It is not a hard error. When to use: Call this when the question matches one of the eight rows and you prefer to state the goal. Otherwise call the primitive. A band at a cell is emem_recall. A region is emem_recall_polygon. A free-text question about a place is emem_ask (type:"ask" sends it there). `window` takes tslots, not dates: get them from emem_trajectory. `areas` puts up to 6 areas on one chart. You can call a tool that this text names but your list does not show, by name, through tools/call. Example arguments: {"type":"did_change","cell":"defi.zb64a.cAzU.zfa27","band":"indices.ndvi","window":[20245,20620]}

NameTypeReqDescription
astring–is_like only: cell64 of the first place in the pair.
areasarray–area_over_time: up to 6 {id,geometry|bbox} on one chart
bstring–is_like only: cell64 of the second place. The answer is a cosine similarity in [-1,1] over the two cells' embeddings.
bandstring–did_change only: which band to test, e.g. "indices.ndvi". One band per call; the answer is a delta over `window`, not a whole-cell diff.
bboxobject––
cellstring–cell64 address, e.g. "defi.zb64a.cAzU.zfa27". Required by did_change and confirm. Optional for what_is_here and ask: supply it to skip geocoding, omit it and give `place` instead.
claimobject–confirm only: the claim to test at `cell`, e.g. {"band":"indices.ndvi","op":"gt","value":0.4}. The answer is a verdict plus the signed facts it rests on.
descriptionstring–where_is: the place to resolve, e.g. "Mount Everest". ask: the user's question, forwarded verbatim. what_is_here: optional free text used as the question and, if `place` is absent, as the place. Igno…
end_datestring–YYYY-MM-DD
filterobject–find_like only: optional claim constraining which cells may be returned. Same object as `claim` below, same ops, same required fields.
geometryobject–area_over_time: GeoJSON Polygon; or bbox {min_lat,min_lng,max_lat,max_lng}.
indexstring––
kinteger–find_like only: how many neighbours to return.
keystring–find_like only: cell64 to search from, ranked by embedding cosine.
latnumber–ask only: latitude, paired with `lng`, when you want to pin the location by coordinate rather than by name or cell64.
lngnumber–ask only: longitude, paired with `lat`.
max_scenesinteger––
placestring–Free-text place name for what_is_here and ask when you have a name but no cell64, e.g. "Ashok Nagar, Ranchi". The responder geocodes it. Ignored when `cell` is present.
start_datestring–YYYY-MM-DD
typestringyesWhich intent; the table in the description gives each row's fields.
windowarray–did_change only: exactly two tslots, [start, end], band-tempo-relative integers from the emem epoch (NOT unix seconds or a date string). Get valid tslots for a cell from emem_trajectory.

No output schema declared.

No examples provided.

emem_locate ~458

Get the canonical address (cell64) of a real-world place. Every agent resolves a place to the same cell64, so two models refer to the same ground. The answer also lists, by topic, the bands and algorithms that you can recall there. For an OBJECT identity (a bridge, a plot) instead of a cell, use emem_entity. Send `lat`+`lng` as numbers, or a free-text place. When both arrive, the coordinates win. `q`, `query` and `name` are other names for `place`. The answer lists keys that this schema does not declare in `_unrecognised_arguments`, so a typo is visible. When to use: Call this when the next step needs the cell64 of a named place, or the bands that exist there. `data_at_this_cell` lists every band you can recall, by topic (`live_bands_by_topic`), the recipes that use them (`algorithms_for_topic`), and the bands with no materializer here. It has `research_nearby` when vouched research agents signed conclusions inside the place. Read those with emem_inferences before you recompute them. For one packaged answer in one call, use `emem_ask`. Example arguments: {"place":"Mount Everest"}

NameTypeReqDescription
latnumber–WGS-84 latitude in degrees, paired with `lng`. REQUIRED with `lng` unless `place`/`q` is provided.
lngnumber–WGS-84 longitude in degrees, paired with `lat`. REQUIRED with `lat` unless `place`/`q` is provided.
namestring–Alias for `place`.
placestring–Free-text place name (e.g. 'Mount Everest', 'Tokyo'). REQUIRED unless `lat`+`lng` is provided. Aliases also accepted: `q`, `query`, `name`.
qstring–Alias for `place`, accepted because OSM/Mapbox/Google Geocoding all use `q`. Provide either this or `place` (or `lat`+`lng`).
querystring–Alias for `place`.
NameTypeReqDescription
cell64string–Pass as `cell` to emem_recall.
data_at_this_cellobject––
nextarrayyes–
place_labelstring|null––
research_nearbyobject–Present when vouched research agents signed conclusions inside the place. Tokens only; read them with emem_inferences.
selectedobject––
statusstring–needs_location: no place named.

No examples provided.

emem_memory_bundle ~520

Combine N (cell, band, tslot?) triples into ONE signed envelope. Each triple goes through the standard recall path, which materializes on a miss. The tool puts the resulting fact_cids in a content-addressed envelope, and the responder signs the full receipt. The `bundle_token` is `emem:bundle:<bundle_cid>`: one string that cites the full set. Memory algebra: the `merge` operation (https://emem.dev/docs/model.html). When to use: Call this when you must cite several (place, band, date) facts as one handle. You can verify the bundle offline with /v1/verify_receipt. The receipt covers all the cited fact_cids and cells. Use this instead of N calls to `emem_memory_token` when the citation is one thing. An example is "the EUDR baseline for these 8 plots at 2020-12-31". The limit is 256 triples for each call. The answer gives `members` and `resolved`, so you can see a bundle that resolved only in part. Example arguments: {"triples":[{"cell":"defi.zb4d9.pefa.zf619","band":"copdem30m.elevation_mean"},{"cell":"defi.zb493.xoso.zcb6a","band":"indices.ndvi"}],"purpose":"audit baseline 2026"}

NameTypeReqDescription
fact_cidsarray–Instead 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_ci…
purposestring–Optional human-readable purpose string. Included in the bundle_cid preimage so the same triples + different purposes produce distinct CIDs.
scopeobject–Multi-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.
triplesarray–One 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: t…

No output schema declared.

No examples provided.

emem_memory_contradictions ~723

Find where the corpus DISAGREES with itself (algebra: competing evidence). Two or more independent sources can sign different values for the same place, band and time. This tool returns that disagreement with a severity from 0 to 1 and a citation for each disputed fact. It does not pick one value and hide the conflict. It tells you when not to trust a single answer. Read the SCOPE before you quote a zero. By default the tool counts only disagreement between two DIFFERENT attesters. One responder that answers from two upstreams counts only with `include_same_attester_sources: true`. When to use: Call this before you rely on a number: 'do the sources agree on X', 'audit this claim'. Use `cell_prefix` for a region and `band` for one band family. `min_severity` removes small differences. Severity depends on the band kind: for a scalar, the spread over the band's range. For a vector, 1 minus the mean cosine. For a category, 1 minus the share of the mode. On a single-responder node, add `include_same_attester_sources: true`. There, the most likely disagreement is one signer that answers from two providers. Each record names its `disagreement_scope`. The receipt cites every disputed cid. To measure a pair, use `emem_diff`. To read the `disagrees_with` edge, use `emem_edges_recall`. Example arguments: {"cell_prefix":"damO","band":"indices.ndvi","min_severity":0.2}

NameTypeReqDescription
bandstring–Band key filter (e.g. `indices.ndvi`). Omit to include all bands.
cellstring–Alias 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.
cell64string–Alias for `cell_prefix`.
cell_prefixstring–A 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 th…
include_same_attester_sourcesboolean–Also 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-re…
limitinteger–Max contradictions to return.
min_severitynumber–Severity 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_sarray–[lo, hi] inclusive Unix-seconds filter on attestations' signed_at, all disagreeing attestations must fall in the window.

No output schema declared.

No examples provided.

emem_memory_token ~502

Make a citation handle, `emem:fact:<cell64>:<fact_cid>` (or `:<state_cid>`). Any agent or LLM resolves it to the same signed object, byte for byte. Give this one string to another agent instead of a new description of the fact. The tool checks that both parts are not empty and do not contain the `:` separator. Memory algebra: the `cite` operation (https://emem.dev/docs/model.html). When to use: Call this when you need one string that cites a place and an attested fact across messages, agents or tools. Use `emem_echo_verify` before you publish the value. FOR MANY FACTS, USE emem_memory_bundle. This is a measured result. A token is 83 to 84 characters and 51 LLM tokens. The value it cites is 11 characters and 5.4 tokens on average. Thus N tokens use about 9.5 times the context of the N numbers. A bundle is 38 characters for any N up to 256, and it resolves in one round trip. It costs less than tokens from N=1, and less than the plain values from N=5. Use one token to cite ONE fact that you must verify later. Example arguments: {"cell":"defi.zb493.xoso.zcb6a","fact_cid":"cxjiu7l54ujzrpnekp24n4534yojpue4mprddbvevnqtti3lh5bq"}

NameTypeReqDescription
bandstring–Optional 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 r…
cellstringyescell64, neither component may contain `:`.
fact_cidstringyes52-char base32-nopad-lowercase content-id of the fact (full 32-byte blake3).
observed_onstring–The 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…
NameTypeReqDescription
cellstringyes–
cell_tokenstring–The address alone, when you mean the place rather than an observation of it.
docsstring––
fact_cidstringyes–
grammarstring–The token grammar, so the form can be parsed rather than pattern-matched.
memory_tokenstringyesThe 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.

No examples provided.

emem_memory_token_resolve ~291

Read a `emem:fact:<cell64>:<fact_cid>` citation handle and return the reading that it cites. `value`, `unit`, `band` and `kind` are at the TOP level of the answer, beside the full signed `fact` body. You do not split the token or call `GET /v1/facts/<cid>` yourself. Memory algebra: the `resolve` operation (https://emem.dev/docs/model.html). When to use: Call this when you have a memory_token from another agent or an earlier turn and need the value. For a scalar, quote `value_verbatim`, the exact decimal string that the responder signed. A null `value` or `unit` means the fact has none (an absence, or an index with no unit). It does not mean a missing field. A cid that this responder does not hold returns a typed 404. Then try /v1/fetch, or resolve at a mirror. Example arguments: {"token":"emem:fact:defi.zb493.xoso.zcb6a:cxjiu7l54ujzrpnekp24n4534yojpue4mprddbvevnqtti3lh5bq"}

NameTypeReqDescription
tokenstringyesA `emem:fact:<cell64>:<fact_cid>` citation handle to dereference.
NameTypeReqDescription
bandstringyes–
canonical_tokenstringyes–
cellstringyes–
fact_cidstringyes–
fact_urlstring––
kindstringyes–
receiptobjectyes–
unitstring|null––
valuenumber|string|boolean|null–Scalars; a vector is in the text's fact.value.
value_verbatimstring––

No examples provided.

emem_recall ~1,127

Read the signed facts at a canonical address (cell64). When a band has no fact yet but has a registered materializer, the responder fetches it. A fact_cid names one signed attestation, so you can cite a fact and verify it again. Resolve the cid anywhere and you get the same bytes. A fact_cid is NOT a fingerprint of the observation. The digest includes the responder's key and the time it signed. Thus two responders that measure the same thing make different fact_cids, and a cid resolves only at the responder that signed it. For identity across responders, use emem_entity. Send `deterministic:true` (or a `provenance` class list) to keep only facts that you can compute from the cited raw source. In the memory algebra this is ensure(cell, bands), not get: you state what must exist. When to use: Call this after `emem_locate`, or with a cell64 or a place name. It returns every Primary fact at that (cell, band, tslot). A band can have no fact but have a materializer. Then the responder fetches the upstream value, signs it, stores it and returns it in the same call. The first call is slow; later calls use the cache. Thus any wired band recalls at any cell on Earth: send `bands: [<band>]`. `materialize_notes` lists what the call fetched. Empty notes mean no materializer here. Example arguments: {"cell":"defi.zb64a.cAzU.zfa27","bands":["weather.temperature_2m","copdem30m.elevation_mean"]}

NameTypeReqDescription
as_of_signed_atstring–Bi-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…
as_of_tslotinteger–Bi-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_ts…
bandstring–optional 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 `ban…
bandsarray–optional band keys to filter, e.g. ['indices.ndvi','geotessera']
cellstringyescell64 string, e.g. 'defi.zb64a.cAzU.zfa27'
cell64string–Alias for `cell`.
deterministicboolean–Sugar 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 +…
includearray–Opt-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…
latnumber–Explicit latitude, an alternative to `cell`; paired with `lng`.
lngnumber–Explicit longitude, paired with `lat`.
placestring–Free-text place name, an alternative to `cell`.
provenancearray–Tamper-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 attest…
scopeobject–Optional 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'} s…
tslotinteger–optional time slot (band-tempo-relative integer offset from emem epoch)
NameTypeReqDescription
bands_already_attested_at_cellarray–What else is readable here without materialising, so an empty result can be told apart from a wrong band name.
current_by_bandobject–Per band, the fact_cid with the highest tslot: the current reading. Unslotted facts are excluded, since tslot 0 means undated rather than oldest.
fact_orderstringyesThe ordering contract for facts, e.g. tslot_ascending. Stated rather than implied so nothing depends on position by accident.
factsarrayyesSigned facts at the cell, ordered per fact_order.
materialize_notesarray––
receiptobjectyesed25519 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 m…

No examples provided.

emem_tools ~761

The map of emem's tools, and the one tool that finds all the others. It gives the working loop in order (name, ground, cite, resolve, verify, check for drift). Then it groups every other tool by the question it answers, each with a one-line trigger. Send `name` for the full schema of one tool and an example that runs. IF YOU SEE A LIST OF 18 TOOLS, IT IS A CURATED SUBSET OF 116, NOT THE FULL SURFACE. Hosts remove `_meta`, so this text repeats the count. You can call every catalogued tool by name through tools/call at either endpoint. When to use: Call this FIRST when you do not know which tool answers the question. Also call it when your list does not have a capability. A tool that is not in your list can still be on the server. `q` searches by topic (`ndvi`, `flood`, `verify`). `name` returns one exact schema. With no arguments, you get the full map. /mcp/full registers the full catalog. emem_ask answers in one call without a choice of primitive. Example arguments: {"q":"ndvi"}

NameTypeReqDescription
bundlestring–Filter by the job you are doing. Call with no arguments first to see each bundle and its size.
categorystring–Filter to one category. This is about the shape of the job, NOT about safety: 43 tools outside `write` declare `readOnlyHint: false` because reading a cold address can materialise or mint as a side e…
namestring–Return 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…
qstring–Free-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 n…
shapestring–Filter 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; `vecto…
tierstring–Which 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 too…

No output schema declared.

No examples provided.

emem_verify_receipt ~703

Verify a signed receipt on the server. The tool builds the canonical preimage again, under the rule that the receipt's `preimage_version` names. It checks the ed25519 signature with the embedded key. It returns `{valid, reason, failure_detail, signature_valid, merkle_proof_valid, signer_pubkey_b32, preimage_blake3_hex}`. A receipt verifies BYTE FOR BYTE OR NOT AT ALL. Version 2 binds the inclusion proof, so a change of any kind makes the signature fail: a dropped field, a renamed field, a summary. Use this tool when the browser page /verify is not available. Also use it to audit a receipt from a third party. When to use: Send the receipt EXACTLY as the read tool returned it, complete and unchanged. Two omissions cause a false forgery, not a 400. Do not drop `merkle_proof`. Do not drop `preimage_version`. Without it the value is 0, which selects the v0 rule, and the signature reads as invalid. The signature and the key can be byte arrays, or `sig_b32` and `responder_pubkey_b32`. The tool accepts no other names. When a field changed after signing, the answer is `reason: receipt_reshaped_after_signing` and names the field. To require a specific signer, set `pubkey_b32`. A bad signature returns 200 with `valid: false`, never a 4xx. The example (from emem_tools) is a real receipt over two Trafalgar Square facts. Unchanged, it is `valid`. Change one 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.

NameTypeReqDescription
current_responder_epochinteger–The 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.
factsarray–The 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`…
pubkey_b32string–Optional explicit responder pubkey (base32). When omitted, uses the receipt's embedded pubkey/responder fields.
receiptobjectyesThe 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` by…

No output schema declared.

No examples provided.

fetch ~306

Dereference an id from `search`. You get the reading in one line, then the signed body, the URL that serves those bytes, and metadata: cell, band, signing time and key. The id can be an `emem:fact:` citation, a bare fact_cid, or an `emem:cell:` handle for a full cell. The value is the exact decimal string that the responder signed, never a new format. A fact handle writes nothing. A cell handle, like `emem_recall`, MATERIALIZES a missing band on a cold cell: it fetches, signs and stores it. The flags follow that path: readOnlyHint false. When to use: Call this on each result that you will cite, before you quote the number. Quote the one-line reading. The body lets a reader check it, and emem_echo_verify grades what you emit against it. When a body is too large, the answer says so and gives the URL that serves it complete. Example arguments: {"id":"emem:fact:defi.zb493.xoso.zcb6a:cxjiu7l54ujzrpnekp24n4534yojpue4mprddbvevnqtti3lh5bq"}

NameTypeReqDescription
idstringyesAn id from `search`: an `emem:fact:` citation, a bare fact_cid, or an `emem:cell:` handle for every fact at one cell.
NameTypeReqDescription
idstringyesEchoed id, in canonical form.
metadataobject–cell, band, when it was signed and by which key: the fields a reader needs to judge the citation without re-fetching it.
textstringyesThe 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.
titlestringyesWhat this record is.
urlstringyesStable URL serving these bytes.

No examples provided.

search ~287

Search emem's signed corpus and get results as citations. Each entry is one signed fact. It has an `id` to dereference, a `title` with band, place and signed value, and a stable `url` that serves those bytes. The query can be a place or a question about one. ('NDVI near Mount Fuji': a topic word narrows the results and never removes all of them.) It can also be a cell64, an `emem:cell:` handle, or an emem citation, which returns the one fact it cites. The list has a cap for the wire. The first entry (index 0) names the cell and the TRUE total. On a cold cell, the tool MATERIALIZES a missing band first, as `emem_recall` does: it fetches, signs and stores it. Thus readOnlyHint false. When to use: Call this first when a question is about a place and the answer must have citations. It changes the question into a list of sources, and `fetch` expands each source. For one combined answer in one call, use emem_ask. Example arguments: {"query":"Trafalgar Square, London"}

NameTypeReqDescription
querystringyesA place, a question about one, a cell64 or emem:cell: handle, or an emem:fact: citation.
NameTypeReqDescription
resultsarrayyesThe FIRST entry (index 0) is the cell itself, carrying the true total, so a capped list still says how much there was; after it, one entry per signed fact.

No examples provided.

Install

How do I install the emem, the verifiable memory protocol for the physical world MCP server?

emem, the verifiable memory protocol for the physical world is a hosted endpoint at https://emem.dev/mcp, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

remote · emem.dev

# add to Claude Code
claude mcp add --transport http vortx-ai-emem 'https://emem.dev/mcp'
Common questions

What is the emem, the verifiable memory protocol for the physical world MCP server?

emem, the verifiable memory protocol for the physical world is an MCP server listed in the public MCP registry as io.github.Vortx-AI/emem. Shared, verifiable memory for machines and AI. Encode where data lives; decode with any AI. This page covers its hosted endpoint (https://emem.dev/mcp).

Is the emem, the verifiable memory protocol for the physical world MCP server safe to use?

emem, the verifiable memory protocol for the physical world scores 87 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

What tools does the emem, the verifiable memory protocol for the physical world MCP server expose?

emem, the verifiable memory protocol for the physical world exposes 18 tools: emem_entity, emem_locate, emem_recall, emem_memory_token, emem_memory_token_resolve, and 13 more. Their descriptions and schemas cost roughly 11,062 tokens of context every time the server is loaded.

Does the emem, the verifiable memory protocol for the physical world MCP server require authentication?

No. We connected to emem, the verifiable memory protocol for the physical world without credentials and it answered, so anything it exposes is reachable by anyone who knows the address.

Is the emem, the verifiable memory protocol for the physical world MCP server still maintained?

emem, the verifiable memory protocol for the physical world is still listed as active in the MCP registry. We last reached this channel on 5 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.