{"apiVersion":"v1","directorySlug":"emem-mcp-2642a43370","title":"emem","description":"emem answers place-based questions with signed Earth-observation and geospatial facts. It can resolve a place, retrieve or materialize available facts, provide verifiable citations, compare similar places, and verify signed receipts.","pageUrl":"https://www.mcpbundles.com/skills/emem-mcp-2642a43370","connectPath":"importable","connectAction":"import_server","catalogListing":false,"bundleSlug":null,"listingKind":"remote_mcp","kind":"provider","transportUrl":"https://emem.dev/mcp","hostedMcpUrl":null,"toolCount":18,"toolInventoryStatus":"observed","refreshedAt":"2026-11-03T13:26:00.516172+00:00","registryName":"dev.emem/emem-mcp-2642a43370","registryVersion":"2026.11.3","registryEligible":true,"tools":[{"name":"emem_entity","description":"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 objec","inputSchema":{"type":"object","required":["label"],"properties":{"lat":{"type":"number","maximum":90,"minimum":-90},"lng":{"type":"number","maximum":180,"minimum":-180},"cell":{"type":"string"},"kind":{"type":"string"},"label":{"type":"string"},"place":{"type":"string"},"parent":{"type":"string"},"external_ids":{"type":"object","properties":{"osm":{"type":"string"},"gers":{"type":"string"},"wikidata":{"type":"string"}}}}},"title":"Mint or get a canonical object identity","logicalName":"emem_entity","displayName":"Mint or get a canonical object identity","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"emem_locate","description":"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","inputSchema":{"type":"object","properties":{"q":{"type":"string"},"lat":{"type":"number"},"lng":{"type":"number"},"name":{"type":"string"},"place":{"type":"string"},"query":{"type":"string"}}},"title":"Resolve place to cell64 + band inventory","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"emem_locate","displayName":"Resolve place to cell64 + band inventory"},{"name":"emem_recall","description":"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 t","inputSchema":{"type":"object","required":["cell"],"properties":{"lat":{"type":"number"},"lng":{"type":"number"},"band":{"type":"string"},"cell":{"type":"string","pattern":"^(?:(?:[bcdfghjklmnpqrstvwxyz][aeiouAEIOU]){2}|z[0-9a-f]{4})(?:\\.(?:(?:[bcdfghjklmnpqrstvwxyz][aeiouAEIOU]){2}|z[0-9a-f]{4})){3}$","maxLength":23,"minLength":19},"bands":{"type":"array","items":{"type":"string"}},"place":{"type":"string"},"scope":{"type":"object","properties":{"org_id":{"type":"string"},"run_id":{"type":"string"},"user_id":{"type":"string"},"agent_id":{"type":"string"}}},"tslot":{"type":"integer"},"cell64":{"type":"string"},"include":{"type":"array","items":{"enum":["freshness","edges","provenance"],"type":"string"}},"provenance":{"type":"array","items":{"enum":["direct_sensor","deterministic_index","estimator","attested_execution","model_output","human_curated","unclassified"],"type":"string"}},"as_of_tslot":{"type":"integer","minimum":0},"deterministic":{"type":"boolean"},"as_of_signed_at":{"type":"string","format":"date-time"}}},"title":"Recall facts at a cell (auto-materializes on miss)","logicalName":"emem_recall","displayName":"Recall facts at a cell (auto-materializes on miss)","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"emem_memory_token","description":"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).","inputSchema":{"type":"object","required":["cell","fact_cid"],"properties":{"band":{"type":"string"},"cell":{"type":"string","pattern":"^(?:(?:[bcdfghjklmnpqrstvwxyz][aeiouAEIOU]){2}|z[0-9a-f]{4})(?:\\.(?:(?:[bcdfghjklmnpqrstvwxyz][aeiouAEIOU]){2}|z[0-9a-f]{4})){3}$","maxLength":23,"minLength":19},"fact_cid":{"type":"string"},"observed_on":{"type":"string"}}},"title":"Compose a memory_token citation handle","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"emem_memory_token","displayName":"Compose a memory_token citation handle"},{"name":"emem_memory_token_resolve","description":"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).","inputSchema":{"type":"object","required":["token"],"properties":{"token":{"type":"string"}}},"title":"Dereference a memory_token in one round-trip","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"emem_memory_token_resolve","displayName":"Dereference a memory_token in one round-trip"},{"name":"emem_verify_receipt","description":"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-brows","inputSchema":{"type":"object","required":["receipt"],"properties":{"facts":{"type":"array"},"receipt":{"type":"object"},"pubkey_b32":{"type":"string"},"current_responder_epoch":{"type":"integer"}}},"title":"Server-side ed25519 receipt verifier","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"emem_verify_receipt","displayName":"Server-side ed25519 receipt verifier"},{"name":"emem_memory_contradictions","description":"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 attes","inputSchema":{"type":"object","properties":{"band":{"type":"string"},"cell":{"type":"string"},"limit":{"type":"integer","default":100,"maximum":1000,"minimum":1},"cell64":{"type":"string"},"cell_prefix":{"type":"string"},"min_severity":{"type":"number","default":0.1,"maximum":1,"minimum":0},"window_unix_s":{"type":"array","items":{"type":"integer","minimum":0},"maxItems":2,"minItems":2},"include_same_attester_sources":{"type":"boolean","default":false}}},"title":"Scan for multi-attester disagreement","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"emem_memory_contradictions","displayName":"Scan for multi-attester disagreement"},{"name":"emem_guard_verdict","description":"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 clai","inputSchema":{"type":"object","properties":{"agent":{"type":"string"},"shape":{"enum":["native","mcp","openai","cloudevent","policy"],"type":"string","default":"native"},"texts":{"type":"array","items":{"type":"string"}},"claim_gating":{"type":"boolean","default":false}}},"title":"Check whether the citations in a draft actually verify","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"emem_guard_verdict","displayName":"Check whether the citations in a draft actually verify"},{"name":"emem_tools","description":"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 t","inputSchema":{"type":"object","properties":{"q":{"type":"string"},"name":{"type":"string"},"tier":{"enum":["core","extended","all"],"type":"string"},"shape":{"enum":["scalar","timeseries","raster","geometry","vector","identity","token","proof","plan","file","catalog"],"type":"string"},"bundle":{"enum":["tokenisation","verification","agent_to_agent","long_horizon","robotics","satellites","agriculture","forestry","climate_risk"],"type":"string"},"category":{"enum":["read","write","verify","introspect","plan"],"type":"string"}}},"title":"What tools exist here, and when to reach for each","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"emem_tools","displayName":"What tools exist here, and when to reach for each"},{"name":"emem_ask","description":"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.","inputSchema":{"type":"object","required":["q"],"properties":{"q":{"type":"string"},"lat":{"type":"number"},"lng":{"type":"number"},"cell":{"type":"string","pattern":"^(?:(?:[bcdfghjklmnpqrstvwxyz][aeiouAEIOU]){2}|z[0-9a-f]{4})(?:\\.(?:(?:[bcdfghjklmnpqrstvwxyz][aeiouAEIOU]){2}|z[0-9a-f]{4})){3}$","maxLength":23,"minLength":19},"model":{"type":"string"},"place":{"type":"string"},"query":{"type":"string"},"include":{"type":"array","items":{"enum":["band_observations","algorithm_outcomes","facts_full","temporal_composition","foundation_embeddings","scene","inventory"],"type":"string"}},"verbose":{"type":"boolean","default":false},"question":{"type":"string"},"include_image":{"type":"boolean","default":false}}},"title":"Ask a free-text question about a place","logicalName":"emem_ask","displayName":"Ask a free-text question about a place","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"search","description":"Search emem's signed corpus and return results shaped as citations: each entry is one signed fact, with an `id` to dereference, a `title` naming band, place and the value as signed, and a stable `url` serving those bytes. Takes a place name, a cell64, or an emem citation handle (a handle returns the one fact it cites). Capped for the wire; the final entry names the cell and the TRUE total. On a cold cell it MATERIALIZES a missing band first, as `emem_recall` does: fetched upstream, signed, persi","inputSchema":{"type":"object","required":["query"],"properties":{"query":{"type":"string"}}},"title":"Find signed facts for a place, as citable sources","logicalName":"search","displayName":"Find signed facts for a place, as citable sources","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"fetch","description":"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),","inputSchema":{"type":"object","required":["id"],"properties":{"id":{"type":"string"}}},"title":"Open one search result and read the signed record","logicalName":"fetch","displayName":"Open one search result and read the signed record","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"emem_echo_verify","description":"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).","inputSchema":{"type":"object","required":["token","claimed_value"],"properties":{"token":{"type":"string"},"strict":{"type":"boolean"},"claimed_value":{"type":["string","number"]}}},"title":"Check a value against the fact it cites, before you publish it","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"emem_echo_verify","displayName":"Check a value against the fact it cites, before you publish it"},{"name":"emem_memory_bundle","description":"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).","inputSchema":{"type":"object","properties":{"scope":{"type":"object"},"purpose":{"type":"string"},"triples":{"type":"array","items":{"type":"object","required":["cell","band"],"properties":{"band":{"type":"string"},"cell":{"type":"string"},"tslot":{"type":"integer"}}},"maxItems":256,"minItems":1},"fact_cids":{"type":"array","items":{"type":"string"},"maxItems":256,"minItems":1}}},"title":"Compose a signed multi-fact memory bundle","logicalName":"emem_memory_bundle","displayName":"Compose a signed multi-fact memory bundle","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"emem_entity_resolve","description":"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.","inputSchema":{"type":"object","properties":{"k":{"type":"integer"},"near":{"type":"string"},"text":{"type":"string"},"label":{"type":"string"},"token":{"type":"string"}}},"title":"Resolve a phrase (or emem:entity: token) to a canonical object","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"emem_entity_resolve","displayName":"Resolve a phrase (or emem:entity: token) to a canonical object"},{"name":"emem_entity_link","description":"Record a signed, ATTRIBUTED claim that a label or external id (GERS / OSM / Wikidata) denotes an existing object, or with `stance: \"disputes\"` that it does not. A shared-space write: it changes what other agents resolve, so it is stored with your key, rate-limited per key, and weighed by how many INDEPENDENT keys agree. One key's binding is shown to every reader as one key's claim, never as the answer.","inputSchema":{"type":"object","properties":{"alias":{"type":"string"},"stance":{"enum":["asserts","disputes"],"type":"string"},"entity_cid":{"type":"string"},"entity_token":{"type":"string"},"external_ids":{"type":"object","properties":{"osm":{"type":"string"},"gers":{"type":"string"},"wikidata":{"type":"string"}}}}},"title":"Attest that a phrasing/id denotes an existing object","logicalName":"emem_entity_link","displayName":"Attest that a phrasing/id denotes an existing object","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"emem_find_similar","description":"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","inputSchema":{"type":"object","required":["key"],"properties":{"k":{"type":"integer","default":10,"maximum":1000,"minimum":1},"key":{"type":"string"},"band":{"type":"string","default":"geotessera"},"cell":{"type":"string"},"mode":{"enum":["cosine","hamming","hamming_then_rerank"],"type":"string","default":"cosine"},"scope":{"type":"object"},"cell64":{"type":"string"},"filter":{"type":"object"},"as_of_tslot":{"type":"integer","minimum":0},"as_of_signed_at":{"type":"string","format":"date-time"}}},"title":"k-NN over the corpus by embedding","logicalName":"emem_find_similar","displayName":"k-NN over the corpus by embedding","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"emem_intent","description":"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.","inputSchema":{"type":"object","required":["type"],"properties":{"a":{"type":"string"},"b":{"type":"string"},"k":{"type":"integer","minimum":1},"key":{"type":"string"},"lat":{"type":"number","maximum":90,"minimum":-90},"lng":{"type":"number","maximum":180,"minimum":-180},"band":{"type":"string"},"cell":{"type":"string"},"type":{"enum":["where_is","what_is_here","is_like","did_change","find_like","confirm","ask"],"type":"string"},"claim":{"type":"object","required":["band","op","value"],"properties":{"op":{"enum":["eq","ne","lt","le","gt","ge","in","ni","exists","absent"],"type":"string"},"agg":{"enum":["any","all","mean","min","max"],"type":"string"},"band":{"type":"string"},"tslot":{"type":"integer"},"value":{"type":["string","number","boolean","array","null"]},"window":{"type":"array","items":{"type":"integer"},"maxItems":2,"minItems":2}}},"place":{"type":"string"},"filter":{"type":"object","required":["band","op","value"],"properties":{"op":{"enum":["eq","ne","lt","le","gt","ge","in","ni","exists","absent"],"type":"string"},"agg":{"enum":["any","all","mean","min","max"],"type":"string"},"band":{"type":"string"},"tslot":{"type":"integer"},"value":{"type":["string","number","boolean","array","null"]},"window":{"type":"array","items":{"type":"integer"},"maxItems":2,"minItems":2}}},"window":{"type":"array","items":{"type":"integer"},"maxItems":2,"minItems":2}}},"title":"Intent-routed planner","logicalName":"emem_intent","displayName":"Intent-routed planner","annotations":{"untrustedContentHint":true,"readOnlyHint":true}}],"toolSource":"directory_preview","agentAction":"both","installLinks":[{"id":"cursor","label":"Cursor","href":"cursor://anysphere.cursor-deeplink/mcp/install?name=emem&config=eyJ1cmwiOiAiaHR0cHM6Ly9lbWVtLmRldi9tY3AifQ%3D%3D"},{"id":"vscode","label":"VS Code","href":"vscode:mcp/install?%7B%22name%22%3A%22emem%22%2C%22type%22%3A%22http%22%2C%22url%22%3A%22https%3A%2F%2Femem.dev%2Fmcp%22%7D"},{"id":"vscode-insiders","label":"VS Code Insiders","href":"vscode-insiders:mcp/install?%7B%22name%22%3A%22emem%22%2C%22type%22%3A%22http%22%2C%22url%22%3A%22https%3A%2F%2Femem.dev%2Fmcp%22%7D"},{"id":"claude-web","label":"Claude.ai","href":"https://claude.ai/customize/connectors?modal=add-custom-connector&connectorName=emem&connectorUrl=https%3A%2F%2Femem.dev%2Fmcp"},{"id":"codex","label":"Codex","copyText":"codex mcp add \"emem\" --url \"https://emem.dev/mcp\""},{"id":"chatgpt","label":"ChatGPT","href":"https://www.mcpbundles.com/docs/integrations/chatgpt"}],"catalogUrl":"https://www.mcpbundles.com/api/directory/v1/servers/emem-mcp-2642a43370","callUrl":"https://www.mcpbundles.com/api/directory/v1/servers/emem-mcp-2642a43370/tools/{tool}","mcpServerUrl":"https://emem.dev/mcp","liveCatalogUrl":"https://www.mcpbundles.com/api/directory/v1/servers/emem-mcp-2642a43370?live=1"}