Connect · REST and MCP
Every route and tool emem.dev serves, sorted by what it does, with the calls agents use most, the token grammar and the transparency log.
Every route and tool, sorted by ordered rules into what writes signed memory and what reads and checks it. Nothing here is listed by hand.
reading /openapi.json and /v1/tools…
A token is a short address one agent hands another. Resolving it returns the signed bytes it names. The family says what it binds, and the families are not equally strong.
emem:fact: familydefi.zb521.jawI.gOze cell64, the addressvtnf7yhai6dp…qytovlpfa fact_cid, BLAKE3-256 of the signed body25.41753,51.50748 lat,lng, 5 or more decimals2021-04-30 capture datecopdem30m~elevation~mean bandvtnf7yhai6dp…qytovlpfa the same fact_cid| Token | Names | Binds | Mint | Resolve |
|---|---|---|---|---|
| emem:fact:<cell64>:<fact_cid> | one signed reading at a place | the whole body, full 32-byte BLAKE3 | /v1/memory_token | /v1/memory_token/resolve |
| emem:fact:<lat>,<lng>@<date>@<band>:<fact_cid> | the same reading, readable | the body; place, band and date checked against it | /v1/memory_token with band and observed_on | /v1/memory_token/resolve |
| emem:bundle:<bundle_cid> | a set of facts | which facts, 16-byte anchor; each member binds its own body | /v1/memory_bundle | /v1/memory_bundle/<token> |
| emem:raster:<aoi_cid>:<band>:<tslot>:<derivation_cid> | one field over an area at one time | area, band and time, checked against a signed derivation record | /v1/band_raster | /v1/raster/resolve |
| emem:cube:<aoi_cid>:<band>:<lo>..<hi>:<derivation_cid> | a field over time | a signed manifest over raster slices; membership recomputed on resolve | /v1/band_cube | /v1/cube/resolve |
| emem:rasterset: | 2 to 64 fields as one | a signed manifest of member raster tokens | /v1/raster_bundle | /v1/raster_bundle/resolve |
| emem:state: | one step of an answer | the cids of its inputs and the step before it | /v1/ask | /v1/state/<cid> |
| emem:trace: | a device's execution trace | a verified, chained trace; never the pixels | /v1/substrates | /v1/trace_resolve |
| emem:attestation: | a device's platform evidence | which hardware root of trust vouched for its key | /v1/device_platforms | /v1/device_platforms |
| emem:entity:<entity_cid> | one real-world object | an identity, 16-byte anchor: a shared reference, not shared bytes | /v1/entity | /v1/entity/resolve |
| emem:cell:<cell64> | a place | nothing: an address until a fact hangs on it | /v1/locate | /v1/recall |
A raster or cube names an array, so its receipt attests a derivation: this responder computed the artifact whose BLAKE3 is artifact_cid, from a pinned scene, over an area (aoi_cid) and a time slot.
Pixels live in an evictable store at GET /v1/artifacts/{cid}. The signed record persists, so an evicted artifact is rebuilt on dereference rather than lost. To verify, resolve the token and re-hash the artifact against artifact_cid.
A cell64 is a string no model saw in training. Coordinates, a date and a band name are, so the descriptor form reads without a lookup. Both forms resolve to the same bytes.
Resolve checks every claim against the signed body first. The coordinates must quantise to the fact's cell, the band must match, and the date must match a source capture time. A mismatch is 409.
Coordinates with fewer than 5 decimals are refused with 400: 4 decimals is about 11 m, which can land on the neighbouring cell.
Resolving a fact token also returns its provenance class. direct_sensor and deterministic_index facts are recomputable from the cited source. model_output and human_curated facts carry a caution note in the same payload.
deterministic: true (or a provenance list) on POST /v1/recall keeps only the matching classes, and the filter runs before the receipt is signed. The old prefixes memt:, memb: and meme: still resolve.
A signature proves who signed and that the bytes are unchanged. It does not prove the value is correct.
The same JSON works in every host that speaks MCP. For a runtime without Streamable HTTP, use the mcp-remote stdio bridge. No key and no install.
{
"mcpServers": {
"emem": {
"type": "http",
"url": "https://emem.dev/mcp"
}
}
}
The MCP layer wraps the same handlers as /openapi.json. Start with emem_ask: it resolves the place, recalls the bands and runs the matching algorithm in one call.
/v1/attest accepts facts only from this responder's key, an enrolled device or a key the operator lists; any other signature gets 403. Per-agent notes and derivations are signed with the agent's own key.
Each has a matching MCP tool. The full surface is /openapi.json; the tool descriptors are at /v1/tools.
| Method | Path | MCP tool | Body / use |
|---|---|---|---|
| POST | /v1/locate | emem_locate | place name → cell64, neighbourhood and live band inventory |
| POST | /v1/recall | emem_recall | {cell, bands?, tslot?, include?, deterministic?, provenance?} → signed facts; fetches and signs on a miss; include:["edges","freshness"] adds typed edges and a staleness score |
| POST | /v1/recall_many | emem_recall_many | up to 256 cells per call; one receipt per cell, no aggregate receipt |
| POST | /v1/recall_polygon | emem_recall_polygon | sampled cells inside a polygon (cells_sampled, is_exhaustive); budget_ms returns a typed partial result |
| POST | /v1/find_similar | emem_find_similar | k-NN over 128-D Tessera embeddings; cosine, hamming or hamming_then_rerank; k from 1 to 1000 |
| POST | /v1/ask | emem_ask | question about a place → answer, reasoning stages and receipts; topics at /v1/topics |
| POST | /v1/hunt | emem_hunt | event + region → top 8 of up to 32 sampled cells |
| POST | /v1/state | emem_state | dense vector at a cell; view=encoder (128-D, default) or view=cube (1792-D) |
| POST | /v1/state_multi | emem_state_multi | one vector per served encoder (today geotessera); typed missing[] for the rest |
| POST | /v1/state_diff | emem_state_diff | vector delta at one cell between two tslots: residual, L2 and cosine |
| POST | /v1/memory_token | emem_memory_token | mint emem:fact:<cell64>:<fact_cid> |
| POST | /v1/memory_token/resolve | emem_memory_token_resolve | one round trip; returns the signed body the cid names |
| POST | /v1/trajectory | emem_trajectory | {cell, band, window} → stored time series; does not fetch past tslots |
| POST | /v1/diff | emem_diff | signed delta of one band between two tslots |
| POST | /v1/verify | emem_verify | structured claim → verdict, evidence fact_cids and a receipt |
| POST | /v1/verify_receipt | emem_verify_receipt | rebuild the preimage, check Ed25519 over BLAKE3 |
| GET | /v1/stream | (SSE) | signed corpus.state ticks; interval 5 to 300 s, default 15 s |
| GET | /v1/corpus_state_stats | emem_corpus_state_stats | one signed snapshot of the stream payload: cells, bands, facts scanned |
| GET | /v1/cells/:cell64/scene.png | emem_cell_scene_rgb | Sentinel-2 true-colour thumbnail, 256×256 PNG |
| GET | /v1/coverage_map.svg | emem_coverage_map | 1440×720 plate-carrée map of corpus density, 1° bins |
Each wraps locate, recall and aggregate into one call that takes {place} or {lat, lng}. The receipts and fact_cids are the same as a manual recall.
| MCP tool | REST | Topic | Source |
|---|---|---|---|
| emem_at | /v1/at | standard bands at a place | the at-a-glance band set, or the bands you pass |
| emem_ndvi | /v1/ndvi | vegetation | Sentinel-2 NDVI, 10 m |
| emem_air | /v1/air | air quality | Copernicus CAMS PM2.5, NO2, O3 |
| emem_lst | /v1/lst | land-surface temperature | MODIS LST day and night, 8-day, 1 km |
| emem_soil | /v1/soil | topsoil, 0 to 30 cm | SoilGrids 2.0, 250 m |
| emem_water | /v1/water | surface water | JRC Global Surface Water recurrence, Sentinel-1 VV |
| emem_forest | /v1/forest | forest cover and loss | Hansen Global Forest Change, ESA WorldCover 2021 |
| emem_weather | /v1/weather | current weather | met.no nowcast |
| emem_elevation | /v1/elevation | elevation | Copernicus DEM 30 m, GMRT over ocean |
| emem_terrain | /v1/terrain | slope, ruggedness, position | 3×3 Copernicus DEM neighbourhood |
| emem_spi | /v1/spi | meteorological drought | McKee 1993 SPI |
| emem_burn_severity | /v1/burn_severity | burn severity | dNBR, Key and Benson classes |
| emem_deforestation_alert | /v1/deforestation_alert | forest-loss alert | NDVI drop and embedding change |
| emem_sar_forest_disturbance | /v1/sar_forest_disturbance | disturbance under cloud | Sentinel-1 VV drop of 3 dB or more |
| emem_rice_ch4 | /v1/rice_ch4 | rice-paddy methane | IPCC 2019 Tier 2, Eq 5.1 |
The read surface is built from a few primitives. Each returns a signed receipt over content-addressed facts, so another peer can reproduce the answer.
| Primitive | What it does |
|---|---|
| recall | facts at a cell for one or more bands; fetches and signs on a miss |
| ask | place resolution, recall and the matching algorithms in one call |
| find_similar | k-NN over foundation embeddings |
| trajectory | one band at one cell across a time window, from stored facts |
| compare / compare_bands | cosine over shared vector bands plus per-band deltas |
| diff | signed delta of one band between two tslots |
| query_region | facts over a region; a bbox is sampled, and only stored cells return |
| field_boundaries | field polygons from Fields of The World (CC-BY-4.0) |
| verify / verify_receipt | rebuild the preimage and check the Ed25519 signature |
| entity | mint or return one object identity (emem:entity:) |
| entity/resolve | match a phrasing to registered objects, ranked by independent corroboration |
| entity/alias | record that two phrasings mean the same object |
| derive | register a value you computed over parent facts, signed with your key; parents must resolve here and share the cell |
| derived | list one attester's derivations; the attester key is required |
When a cell has no value for a band, the answer is a signed absence with a typed reason, citable like any fact.
Analytics over sets of 128-D GeoTessera vectors, computed on CPU. When too few cells carry a vector, each returns a signed inconclusive with the observed count. The two render endpoints return images and are REST only.
| MCP tool | REST | What it does |
|---|---|---|
| REST only | /v1/tessera_field | the 128-D Tessera vector per cell over an area |
| REST only | /v1/region_archetype_map | clusters an area into archetypes in embedding space and returns the map |
| emem_embedding_centroid | /v1/embedding_centroid | mean vector over a region, L2-normalised, with a centroid_cid |
| emem_region_similarity | /v1/region_similarity | cosine between two regions' centroids, in [-1, 1] |
| emem_embedding_diversity | /v1/embedding_diversity | mean pairwise cosine distance across a region |
| emem_neighborhood_consistency | /v1/neighborhood_consistency | mean cosine to the 8 neighbours; 1 minus that is an outlier score |
Reads over the edges between facts and the notes agents write.
| MCP tool | REST | What it does |
|---|---|---|
| emem_edges_recall | /v1/edges/recall | typed edges into or out of a fact, bi-temporally filtered |
| emem_memory_search | /v1/memory/search | semantic search over agent notes (BGE-base, 768-D) |
| emem_memory_contradictions | /v1/memory_contradictions | (cell, band, tslot) triples where signed values from different attesters disagree |
| REST only | /v1/explain | model-written prose over a read, labelled signed:false; cite the fact_cids beside it |
/v1/hunt takes an event and a region. It samples up to 32 cells, recalls the event's primary band at each, and returns the top 8 with cell64, value, fact_cid and a scene.png URL.
| algal_bloom | chlorophyll proxy from NDCI with an NDWI water gate (algal_bloom_chlorophyll_ndci@1) |
| deforestation | NDVI drop against the recent baseline (deforestation_alert_ndvi_drop@1) |
| flood_extent | Sentinel-1 SAR VV threshold (flood_extent_sar_threshold@1) |
| wildfire | dNBR burn intensity (wildfire_burn_intensity_dnbr_finetune@1) |
| urban_heat_island | MODIS LST against canopy cover (urban_heat_island_lst_canopy@1) |
| methane_plume | SWIR anomaly over baseline (methane_plume_swir_anomaly@1) |
| landslide | post-event Sentinel-1 ΔVV with slope (landslide_post_event_sar_dnn@1) |
| drought | SPI meteorological drought index (spi_meteorological_drought@1) |
| soil_salinity | soil salinity index from optical bands (soil_salinity_index@1) |
| crop_stress | crop stress score from NDVI and NDRE (crop_stress_score@1) |
| water_turbidity | Sentinel-2 red-band reflectance, water-mask gated (water_turbidity_red_band@1) |
| oil_slick | no algorithm yet; returns not_yet_implemented with a SAR-darkening workaround |
Free-text questions such as “where is deforestation happening in the Amazon” reach the same path through /v1/ask. Ranking uses the primary band only; the full formula is at /v1/algorithms/<key>.
Three solvers run on signed inputs. Each returns its result with the fact_cids its initial condition was built from.
| Method | Path | MCP tool | Model |
|---|---|---|---|
| POST | /v1/heat_solve | emem_heat_solve | heat equation on a 3×3 stencil of MODIS 8-day LST, N hours ahead, CFL-stable timestep |
| POST | /v1/wave_solve | emem_wave_solve | 1-D shallow-water wave equation, c² = g·h, along a GMRT bathymetry profile; refuses a land-locked profile |
| POST | /v1/jepa_predict | emem_jepa_predict | next-month NDVI from up to 24 past months; closed-form AR(2) with fixed α=0.6, β=0.3, γ=0.1 |
Every write is appended to a Merkle log. A client that pins a head can later prove the log only grew.
| Path | What it does |
|---|---|
| GET /v1/log/sth | signed tree head: (tree_size, root); pin it |
| GET /v1/log/inclusion | audit path from one entry to the head, by leaf index or entry hash |
| GET /v1/log/consistency | proof that a later tree extends a head you pinned |
| POST /v1/log/witness | submit a co-signature over a head; refused unless the root matches this log's history |
| GET /v1/log/witnesses | co-signatures on record, with the count of independent operators |
The tree uses RFC 6962's construction with BLAKE3-256 in place of SHA-256, so Certificate Transparency tooling will not read it.
This page lists the calls agents use most. The complete contract is /openapi.json, with every documented path under /v1/*.
The read surface implements the algebra in the memory model. Each verb is an existing endpoint.
| Verb | Surface |
|---|---|
| ensure(a, B) | POST /v1/recall: reuse what exists, fetch what is missing |
| valid(M, a) | POST /v1/temporal_route: per-band validity, cite_now or fetch_for_intent |
| diff | POST /v1/diff · /v1/state_diff |
| merge | POST /v1/memory_bundle: one signed envelope, one citable name |
| verify | POST /v1/verify_receipt · /verify in the browser · offline from the receipt bytes |
| trace | in the fact body: derivation.fn_key and sources[]; formulas at /v1/algorithms |
| competing | POST /v1/memory_contradictions: disagreement kept as scored evidence |
| cite / resolve | POST /v1/memory_token · /v1/memory_token/resolve |
| evolve | POST /v1/attest · supersedes edges; nothing is erased |
Browse the contract in the API reference (ReDoc). Agent discovery starts at /v1/agent_card, /agent.json or /.well-known/mcp.json.