CCM
/MCP
SkillsMCPMarketplacesDigestToolsAdvertise

This week in Claude

Every Monday: Claude Code, Agent SDK, MCP, and the Anthropic platform moves worth your time.

Skills by Category
Frontend DevelopmentBackend & APIsTesting & QASecurityDevOps & CI/CDGit & Pull RequestsDocumentationCode Review & QualityAI & Agent BuildingSkill Development
MCP Servers by Category
Sales & MarketingWeb & Browser AutomationDatabasesAI & LLM ToolsCloud & InfrastructureCommunication & MessagingDeveloper ToolsDesign & CreativeDocuments & KnowledgeSearch & Web Crawling
Marketplaces by Category
AI Agents & OrchestrationLLM IntegrationDevelopment ToolsFrontend & UIBackend & APIsDatabasesTesting & Code QualityDevOps & CloudSecurity & ComplianceGit & Version Control

Claude Code Marketplaces

Discover Claude Code plugins, extensions, and tools. Automatically updated directory of Anthropic Claude AI marketplaces with development tools, productivity plugins, and integrations.

Resources

  • Browse Skills
  • Browse MCP Servers
  • Browse Marketplaces
  • Plugins Reference

Community

  • About
  • Tools
  • Feedback
  • Privacy Policy
  • Advertise

Built for the Claude Code community with Claude Code by @mertduzgun

Independent project, not affiliated with Anthropic

emem — Earth memory protocol

vortx-ai/emem
3080 toolsHTTPregistry active
Summary

Every location on Earth gets a 64-bit cell identifier and a cryptographically signed answer for elevation, land cover, climate, or one of 46 remote sensing bands. Ask for a fact at a cell and emem fetches the tile, signs it with ed25519, persists it, and returns a content-addressed receipt you can verify at /verify without trusting the server. The MCP interface exposes locate, recall_bands, memory_create, memory_search, and memory_contradictions. Cold reads take 180ms, warm reads under 10ms, no API keys required. Four foundation models (Clay, Prithvi, Tessera, Galileo) run server-side for consensus scoring on deforestation, wetland change, and disaster anomaly. Reach for this when your agent needs a stable, auditable handle for real-world coordinates instead of hallucinating numbers.

Install to Claude Code

verified
claude mcp add --transport http emem https://emem.dev/mcp

Run in your terminal. Add --scope user to make it available in every project.

Review the command, arguments, and environment values before installing — MCP servers run with your local permissions.

CodeRabbit
CodeRabbit
AI writes the code. CodeRabbit catches the slop.
Try For Free →
AppSignal
AppSignal
Monitor with ease. Code with confidence.
Start Free Trial →
AI notepad for back-to-back meetings
AI notepad for back-to-back meetings
Notes, actions and memory. Without a meeting bot. First month 100% off.
Download for free →
Keep your Mac awake
Keep your Mac awake
Keep your Mac awake while Claude Code and 40+ AI agents run. Sleeps when they're idle.
One time payment $9 →
Email for Agents: Free tier availableEmail for Agents: Free tier available
Email for Agents: Free tier available
Give your AI agent a complete email layer—sending, inbound inboxes, and sandbox testing.
Get 4K emails/month free →
Context.devContext.dev
Context.dev
Integrate web data into your AI product. One API to scrape website & brand data.
Get API Key Now →
CodeScene MCP ServerCodeScene MCP Server
CodeScene MCP Server
Your agent targets a perfect 10 Code Health score. Deterministic. Every commit.
Try For Free →
Make your agent a DeFi expert
Make your agent a DeFi expert
Agent, run crypto. Access onchain data & trade routes via 1inch.
Install now →
CodeRabbit
CodeRabbit
AI writes the code. CodeRabbit catches the slop.
Try For Free →
AppSignal
AppSignal
Monitor with ease. Code with confidence.
Start Free Trial →
AI notepad for back-to-back meetings
AI notepad for back-to-back meetings
Notes, actions and memory. Without a meeting bot. First month 100% off.
Download for free →
Keep your Mac awake
Keep your Mac awake
Keep your Mac awake while Claude Code and 40+ AI agents run. Sleeps when they're idle.
One time payment $9 →
Email for Agents: Free tier availableEmail for Agents: Free tier available
Email for Agents: Free tier available
Give your AI agent a complete email layer—sending, inbound inboxes, and sandbox testing.
Get 4K emails/month free →
Context.devContext.dev
Context.dev
Integrate web data into your AI product. One API to scrape website & brand data.
Get API Key Now →
CodeScene MCP ServerCodeScene MCP Server
CodeScene MCP Server
Your agent targets a perfect 10 Code Health score. Deterministic. Every commit.
Try For Free →
Make your agent a DeFi expert
Make your agent a DeFi expert
Agent, run crypto. Access onchain data & trade routes via 1inch.
Install now →

Tools

Verified live against the running server on Jun 10, 2026.

verified live80 tools
emem_locateResolves a place mention (free-text name, address, or lat/lng) to the protocol's cell64 identifier, and returns the topic-grouped inventory of bands and algorithms available at that location. When to use: Use whenever the input refers to a real-world location and the next step...4 params

Resolves a place mention (free-text name, address, or lat/lng) to the protocol's cell64 identifier, and returns the topic-grouped inventory of bands and algorithms available at that location. When to use: Use whenever the input refers to a real-world location and the next step...

Parameters* required
qstring
Alias for `place` — accepted because OSM/Mapbox/Google Geocoding all use `q`. Provide either this or `place` (or `lat`+`lng`).
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.
placestring
Free-text place name (e.g. 'Mount Everest', 'Tokyo'). REQUIRED unless `lat`+`lng` is provided. Aliases also accepted: `q`, `query`, `name`.
emem_askSingle-shot free-text answer about a real-world location, backed by signed satellite/elevation/water/built-up receipts. Forwards a place mention plus a question; runs the locate → recall → algorithm chain server-side; returns one packaged envelope. When to use: Use when the qu...8 params

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

Parameters* required
q*string
User's natural-language question about the place (e.g. "is this neighbourhood flood-prone").
latnumber
WGS-84 latitude (paired with `lng`; alternative to `place` / `cell`).
lngnumber
WGS-84 longitude (paired with `lat`).
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`.
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 Nominatim.
includearray
Opt-in heavy response sections. Default response is slim (~5 KB): answer + algorithm key + fact_cids + caveats. Name specific sections to include them. Ignored when verbose=true (which includes everything).
verboseboolean
When true, return the full envelope: per-algorithm formula strings, temporal_recipe blocks, per-fact band_metadata duplicates, and the long _explanation prose. Default (since 2026-05-05) is false so the response fits MCP's 25 KB cap; the signed receipt + fact CIDs + algorithm keys + algorithms_cid are always retained. Pass true to get the full body when debugging.default: false
include_imageboolean
Bundle a Sentinel-2 RGB scene URL for the resolved cell. Adds ~1-2 s on first call.default: false
emem_huntEvent-discovery sweep: pick an event keyword (algal_bloom, deforestation, flood_extent, wildfire, urban_heat_island, methane_plume, landslide, drought, soil_salinity, crop_stress, water_turbidity, oil_slick) plus a region (free-text name or polygon_bbox). The responder geocode...3 params

Event-discovery sweep: pick an event keyword (algal_bloom, deforestation, flood_extent, wildfire, urban_heat_island, methane_plume, landslide, drought, soil_salinity, crop_stress, water_turbidity, oil_slick) plus a region (free-text name or polygon_bbox). The responder geocode...

Parameters* required
event*string
Event keyword. Maps to one registered detection algorithm: algal_bloom → algal_bloom_chlorophyll_ndci@1, deforestation → deforestation_alert_ndvi_drop@1, flood_extent → flood_extent_sar_threshold@1, wildfire → wildfire_burn_intensity_dnbr_finetune@1, urban_heat_island → urban_heat_island_lst_canopy@1, methane_plume → methane_plume_swir_anomaly@1, landslide → landslide_post_event_sar_dnn@1, drought → spi_meteorological_drought@1, soil_salinity → soil_salinity_index@1, crop_stress → crop_stress_score@1, water_turbidity → water_turbidity_red_band@1. `oil_slick` has no algorithm in the registry yet — the responder returns `status: not_yet_implemented` with pointers at the closest available SAR-darkening + turbidity proxies.one of algal_bloom · deforestation · flood_extent · wildfire · urban_heat_island · methane_plume
regionstring
Free-text region (e.g. "Persian Gulf", "Sahel", "Lake Erie", "California"). Resolved through the same geocoder as /v1/locate. REQUIRED unless `polygon_bbox` is provided.
polygon_bboxobject
Explicit polygon bbox; alternative to `region`. Provide when you already have coordinates from a prior locate / recall_polygon call.
emem_eudr_ddsProduce a Due Diligence Statement per Regulation (EU) 2023/1115 for one or more plots. Each plot carries operator-supplied geometry (GeoJSON Polygon for >4 ha, Point for ≤4 ha non-cattle per Article 2(28)), country of production (ISO3), Combined Nomenclature code (HS-6+), and...6 params

Produce a Due Diligence Statement per Regulation (EU) 2023/1115 for one or more plots. Each plot carries operator-supplied geometry (GeoJSON Polygon for >4 ha, Point for ≤4 ha non-cattle per Article 2(28)), country of production (ISO3), Combined Nomenclature code (HS-6+), and...

Parameters* required
plots*array
One or more plots to evaluate for EUDR compliance.
operatorobject
cut_off_datestring
EUDR cut-off date in ISO 8601. The regulation's value is 2020-12-31; only loss after this date counts as failure.default: 2020-12-31
legality_modulestring
Operator-chosen legality provider. Default null surfaces the explicit Article 9(1)(b) out-of-EO-scope disclaimer.
max_cells_per_plotinteger
Sample budget per POLYGON plot. Omit to auto-derive from polygon area (~110 cells/ha, clamped to 51,200) so the whole plot is evaluated; EUDR plots are typically large, so do not set a small value unless you have a tight latency budget. POINT plots evaluate at 1 cell.
forest_baseline_overridestring
Optional baseline override. Default 'jrc_gfc2020_v3' is the EU Commission's expected (non-binding) baseline. Acceptable: 'jrc_gfc2020_v3', 'hansen_only', 'both'.
emem_spiCompute the Standardized Precipitation Index (McKee et al. 1993) at a cell: fit a gamma distribution to the same-window precipitation-accumulation history, then standardize the current accumulation to a z-score and map it to a drought class (extreme/severe/moderate drought … n...4 params

Compute the Standardized Precipitation Index (McKee et al. 1993) at a cell: fit a gamma distribution to the same-window precipitation-accumulation history, then standardize the current accumulation to a z-score and map it to a drought class (extreme/severe/moderate drought … n...

Parameters* required
cell*string
cell64 or place name.
window_daysinteger
Accumulation window (SPI-3 = 90 d default; SPI-1 = 30 d; SPI-12 = 360 d).
precip_history_mmarray
Optional explicit same-window precipitation accumulations (mm). When omitted the endpoint reads the stored weather.precipitation_mm trajectory.
current_accumulation_mmnumber
Current-window accumulation (mm); required when precip_history_mm is supplied, else taken as the most-recent window from the stored series.
emem_burn_severityCompute the differenced Normalized Burn Ratio (dNBR = NBR_pre − NBR_post; Key & Benson 2006) and map it to the USGS burn-severity classes (unburned / low / moderate-low / moderate-high / high). Supply `nbr_pre` + `nbr_post` (pin the scenes bracketing the fire date) for a corre...3 params

Compute the differenced Normalized Burn Ratio (dNBR = NBR_pre − NBR_post; Key & Benson 2006) and map it to the USGS burn-severity classes (unburned / low / moderate-low / moderate-high / high). Supply `nbr_pre` + `nbr_post` (pin the scenes bracketing the fire date) for a corre...

Parameters* required
cell*string
cell64 or place name.
nbr_prenumber
Pre-fire NBR. Pin the scene just before the fire date for a correct result.
nbr_postnumber
Post-fire NBR. When both nbr_pre and nbr_post are omitted the endpoint uses the two most-recent stored indices.nbr scenes (older=pre, newer=post).
emem_rice_ch4Estimate seasonal CH4 emissions from rice cultivation per IPCC 2019 Refinement Eq 5.1: integrate the daily emission factor over the cultivation period with water-regime scaling (SFp pre-season, SFo organic amendment) and an optional Yan-2005 Q10 temperature modifier. `cultivat...7 params

Estimate seasonal CH4 emissions from rice cultivation per IPCC 2019 Refinement Eq 5.1: integrate the daily emission factor over the cultivation period with water-regime scaling (SFp pre-season, SFo organic amendment) and an optional Yan-2005 Q10 temperature modifier. `cultivat...

Parameters* required
sfonumber
Organic-amendment scaling factor SFo (Table 5.14); default 1.00 (no amendment).
sfpnumber
Pre-season water-regime scaling factor SFp (Table 5.13); default 0.68 (non-flooded pre-season > 180 d).
cell*string
cell64 or place name.
t_paddy_cnumber
Mean paddy-water temperature (°C) for the Yan-2005 Q10 modifier; omit to disable the temperature correction (T_mod = 1).
ndwi_seriesarray
Optional explicit NDWI series across the cultivation period. When omitted the endpoint reads the stored indices.ndwi trajectory.
efc_kg_ch4_ha_day*number
Regional baseline EFc (kg CH4/ha/day) from IPCC 2019 Table 5.11. REQUIRED — pick the row for the cell's IPCC region (Asia.S 0.85, Asia.SE 1.22, Europe 1.56, …); the global 1.19 default would bias inventories ~30%.
cultivation_period_days*number
Cultivation-period length in days (typically 110–150). REQUIRED — IPCC Eq 5.1 integrates the daily EF over this period; no defensible global default.
emem_deforestation_alertComposite deforestation-alert score: `alert_score = 0.5·clamp01(ndvi_drop/0.30) + 0.5·clamp01(embedding_change/0.20)`, where `ndvi_drop = max(0, ndvi_modis_baseline − ndvi_now)` and `embedding_change = 1 − cos(tessera_latest, tessera_prev)`. Each half degrades INDEPENDENTLY an...1 params

Composite deforestation-alert score: `alert_score = 0.5·clamp01(ndvi_drop/0.30) + 0.5·clamp01(embedding_change/0.20)`, where `ndvi_drop = max(0, ndvi_modis_baseline − ndvi_now)` and `embedding_change = 1 − cos(tessera_latest, tessera_prev)`. Each half degrades INDEPENDENTLY an...

Parameters* required
cell*string
cell64 or place name.
emem_sar_forest_disturbanceCloud- and night-independent Sentinel-1 C-band confirmation of forest disturbance. Intact forest scatters VV strongly + stably (canopy volume scattering); clearing collapses that term so VV backscatter DROPS ~3-5 dB. Samples VV at a baseline-year July-1 anchor and the latest s...2 params

Cloud- and night-independent Sentinel-1 C-band confirmation of forest disturbance. Intact forest scatters VV strongly + stably (canopy volume scattering); clearing collapses that term so VV backscatter DROPS ~3-5 dB. Samples VV at a baseline-year July-1 anchor and the latest s...

Parameters* required
cell*string
cell64 or place name.
baseline_yearinteger
Baseline calendar year the VV drop is measured against (default 2020, the EUDR cut-off year). Baseline VV is sampled at a July-1 anchor of this year; the recent VV is the latest scene.
emem_triple_consensusThree-encoder change ensemble: compute the cosine change between the two most-recent DISTINCT vintages for each of the Clay, Prithvi, and Tessera embeddings at the cell, then vote each encoder's change against `consensus_threshold` (registry default 0.15). Returns each encoder...2 params

Three-encoder change ensemble: compute the cosine change between the two most-recent DISTINCT vintages for each of the Clay, Prithvi, and Tessera embeddings at the cell, then vote each encoder's change against `consensus_threshold` (registry default 0.15). Returns each encoder...

Parameters* required
cell*string
cell64 or place name.
consensus_thresholdnumber
Override the registry consensus gate (default 0.15); clamped to (0,1).
emem_terrainCompute three standard DEM terrain indices from one 3×3 Copernicus-DEM (copdem30m.elevation_mean) neighbourhood at a cell: Horn (1981) slope in degrees, Riley (1999) Terrain Ruggedness Index (TRI = sqrt(Σ(Z_centre−Z_i)²)), and Weiss (2001) Topographic Position Index (TPI = Z_c...2 params

Compute three standard DEM terrain indices from one 3×3 Copernicus-DEM (copdem30m.elevation_mean) neighbourhood at a cell: Horn (1981) slope in degrees, Riley (1999) Terrain Ruggedness Index (TRI = sqrt(Σ(Z_centre−Z_i)²)), and Weiss (2001) Topographic Position Index (TPI = Z_c...

Parameters* required
cell*string
cell64 or place name. The 8 neighbour cell64s are derived by perturbing the decoded lat/lng step_cells pitches per axis.
step_cellsinteger
Stencil step in cell64 pitches (default 3 ≈ 28.7 m, matching the ~30 m Copernicus DEM native resolution). step_cells=1 samples below the DEM resolution and reads flat inside one source pixel; raise it to measure slope at a coarser scale.default: 3
emem_region_similarityAnswer 'how alike are these two places?' Mean-pool the 128-D GeoTessera embedding across each region's cells to get a centroid, then return the cosine similarity in [-1,1] (+1 = identical landscape, 0 = unrelated). Each region is {place} | {polygon_bbox} | {cells}. CPU-fetched...3 params

Answer 'how alike are these two places?' Mean-pool the 128-D GeoTessera embedding across each region's cells to get a centroid, then return the cosine similarity in [-1,1] (+1 = identical landscape, 0 = unrelated). Each region is {place} | {polygon_bbox} | {cells}. CPU-fetched...

Parameters* required
region_a*object
First region: {place} | {polygon_bbox:{min_lat,max_lat,min_lng,max_lng}} | {cells:[cell64,...]}.
region_b*object
Second region, same shape as region_a.
max_cellsinteger
Per-region cell cap.default: 64
emem_embedding_centroidMean-pool the 128-D GeoTessera embedding over a region's cells: centroid = (1/N) Σ v_i, plus the L2-normalised centroid and a content-addressed centroid_cid. The building block region_similarity composes. Region is {place} | {polygon_bbox} | {cells}. NaN dims are averaged over...4 params

Mean-pool the 128-D GeoTessera embedding over a region's cells: centroid = (1/N) Σ v_i, plus the L2-normalised centroid and a content-addressed centroid_cid. The building block region_similarity composes. Region is {place} | {polygon_bbox} | {cells}. NaN dims are averaged over...

Parameters* required
cellsarray
Explicit cell64 list (taken verbatim, capped by max_cells). Alternative to place/polygon_bbox.
placestring
Free-text place name; resolved through the layered geocoder to a polygon bbox, then sampled. One of place/polygon_bbox/cells required.
max_cellsinteger
Cap on cells sampled from the region; surfaced as coverage_capped.default: 64
polygon_bboxobject
Explicit bbox; sampled on a grid. Alternative to place/cells.
emem_embedding_diversityQuantify how varied a region's landscape is: diversity = (1/(N(N-1))) Σ_{i<j} (1 − cosine(v_i, v_j)), the mean pairwise cosine distance over the region's GeoTessera embeddings. 0 = perfectly uniform; higher = more heterogeneous land cover (a determinantal-point-process / k-med...4 params

Quantify how varied a region's landscape is: diversity = (1/(N(N-1))) Σ_{i<j} (1 − cosine(v_i, v_j)), the mean pairwise cosine distance over the region's GeoTessera embeddings. 0 = perfectly uniform; higher = more heterogeneous land cover (a determinantal-point-process / k-med...

Parameters* required
cellsarray
Explicit cell64 list (taken verbatim, capped by max_cells). Alternative to place/polygon_bbox.
placestring
Free-text place name; resolved through the layered geocoder to a polygon bbox, then sampled. One of place/polygon_bbox/cells required.
max_cellsinteger
Cap on cells sampled from the region; surfaced as coverage_capped.default: 64
polygon_bboxobject
Explicit bbox; sampled on a grid. Alternative to place/cells.
emem_neighborhood_consistencyScore how much a cell looks like its surroundings: consistency = (1/8) Σ cosine(centre, neighbour_i) over the 8 immediate cell64 neighbours, plus outlier_score = 1 − consistency. High consistency = the cell blends in (Tobler's First Law); high outlier_score = it stands out — a...1 params

Score how much a cell looks like its surroundings: consistency = (1/8) Σ cosine(centre, neighbour_i) over the 8 immediate cell64 neighbours, plus outlier_score = 1 − consistency. High consistency = the cell blends in (Tobler's First Law); high outlier_score = it stands out — a...

Parameters* required
cell*string
Target cell64 or place name. Scored against its 8 immediate cell64 neighbours.
emem_stateGet one dense numeric fingerprint that summarises everything known about a place — ready to feed into similarity search, a classifier, or clustering. Two views: `encoder` returns a single AI-model embedding (128-D Tessera, 1024-D Clay, 1024-D Prithvi); `cube` returns the full...9 params

Get one dense numeric fingerprint that summarises everything known about a place — ready to feed into similarity search, a classifier, or clustering. Two views: `encoder` returns a single AI-model embedding (128-D Tessera, 1024-D Clay, 1024-D Prithvi); `cube` returns the full...

Parameters* required
cell*string
cell64 OR free-text place name.
viewstring
Default `encoder` (single-band native vector). Pass `cube` for the full 1792-D voxel with coverage manifest, full-fidelity extras, and a humanised `scalars` map.one of encoder · cube
tslotinteger
Optional tslot bucket; omit for natural per-band vintages.
encoderstring
For `view=encoder`: which vector band to read. Defaults to `geotessera`.
familiesarray
`view=cube` only. Limit the cube to a subset of band families (e.g. ["foundation","vegetation"]). Slots from other families report `status:"filtered_out"`.
as_of_tslotinteger
Bi-temporal valid-time bound — forwarded to the underlying recall. Lets `/v1/state` answer `what did this place look like as of date X` for both encoder and cube views.
materializeboolean
`view=cube` only. Opt in to FULL auto-materialisation. Default false. The cube view auto-warms geotessera on a cold cell regardless of this flag, so view=cube is never less informative than view=encoder.
as_of_signed_atstring
Bi-temporal transaction-time bound (RFC 3339).
include_reservedboolean
`view=cube` only. Include declared-but-inert placeholder slots (`_reserved_128`, `reserved`) in the coverage manifest. Default false.
emem_state_multiGet the place's fingerprint from several AI models at once (`geotessera`, `clay_v1`, `prithvi_eo2`, `galileo`) in one call, returned as a per-model map. Each model is tried independently; any that can't produce a vector here show up under `missing` with a reason instead of fai...5 params

Get the place's fingerprint from several AI models at once (`geotessera`, `clay_v1`, `prithvi_eo2`, `galileo`) in one call, returned as a per-model map. Each model is tried independently; any that can't produce a vector here show up under `missing` with a reason instead of fai...

Parameters* required
cell*string
tslotinteger
encodersarray
Optional explicit list; defaults to all wired foundation encoders (`geotessera`, `clay_v1`, `prithvi_eo2`, `galileo`).
as_of_tslotinteger
Bi-temporal valid-time bound — forwarded to every per-encoder recall.
as_of_signed_atstring
Bi-temporal transaction-time bound (RFC 3339).
emem_state_diffVector delta between the same cell at two tslots: returns the per-element residual, its L2 norm (scalar change-magnitude), the cosine between the two source vectors (orientation drift), and both source fact CIDs so the agent can quote both attestations as evidence. When to use...4 params

Vector delta between the same cell at two tslots: returns the per-element residual, its L2 norm (scalar change-magnitude), the cosine between the two source vectors (orientation drift), and both source fact CIDs so the agent can quote both attestations as evidence. When to use...

Parameters* required
cell*string
encoderstring
Default `geotessera`.
tslot_a*integer
First tslot.
tslot_b*integer
Second tslot; must differ from `tslot_a`.
emem_memory_tokenCompose a `memt:<cell64>:<fact_cid>` (or `memt:<cell64>:<state_cid>`) citation handle. Validates both components are non-empty and do not contain the outer separator `:`. When to use: Call when the agent wants a single rebindable string to cite a place + attested fact across m...2 params

Compose a `memt:<cell64>:<fact_cid>` (or `memt:<cell64>:<state_cid>`) citation handle. Validates both components are non-empty and do not contain the outer separator `:`. When to use: Call when the agent wants a single rebindable string to cite a place + attested fact across m...

Parameters* required
cell*string
cell64 — neither component may contain `:`.
fact_cid*string
26-char base32-nopad-lowercase content-id of the fact.
emem_memory_token_resolveParse a `memt:<cell64>:<fact_cid>` citation handle and return the signed fact body the cid binds. Saves the agent from string-splitting the token and chaining `GET /v1/facts/<cid>` manually. When to use: Call when an agent receives a memory_token from another agent (or out of...1 params

Parse a `memt:<cell64>:<fact_cid>` citation handle and return the signed fact body the cid binds. Saves the agent from string-splitting the token and chaining `GET /v1/facts/<cid>` manually. When to use: Call when an agent receives a memory_token from another agent (or out of...

Parameters* required
token*string
A `memt:<cell64>:<fact_cid>` citation handle to dereference.
emem_memory_bundleCompose 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`...2 params

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`...

Parameters* required
purposestring
Optional human-readable purpose string. Included in the bundle_cid preimage so the same triples + different purposes produce distinct CIDs.
triples*array
One or more (cell, band, tslot?) triples to bundle. Each entry is recalled through the standard auto-materialize path; the bundle envelope cites every resulting fact_cid.
emem_memory_bundle_resolveParse a `memb:<bundle_cid>` token and return the signed bundle envelope: every citation (cell, band, resolved_tslot, fact_cid, memory_token), the receipt, the responder pubkey, and the deduped flat cells[] / fact_cids[] arrays. Returns 404 with a typed code when the responder...1 params

Parse a `memb:<bundle_cid>` token and return the signed bundle envelope: every citation (cell, band, resolved_tslot, fact_cid, memory_token), the receipt, the responder pubkey, and the deduped flat cells[] / fact_cids[] arrays. Returns 404 with a typed code when the responder...

Parameters* required
token*string
A `memb:<bundle_cid>` rebindable handle to dereference.
memory_viewRead the contents of a memory file at `/memories/<path>` or list a directory when the path ends with `/`. Optional `view_range: [start, end]` slices a 1-indexed inclusive line range out of the file. Mirrors the `view` verb in Anthropic's context-management-2025-06-27 memory to...4 params

Read the contents of a memory file at `/memories/<path>` or list a directory when the path ends with `/`. Optional `view_range: [start, end]` slices a 1-indexed inclusive line range out of the file. Mirrors the `view` verb in Anthropic's context-management-2025-06-27 memory to...

Parameters* required
kindstring
Optional kind filter when listing a directory. Restricts entries to one memory type (episodic|semantic|procedural|resource).one of episodic · semantic · procedural · resource
path*string
`/memories/<file>` for a file, or `/memories/<subdir>/` for a directory listing. Must stay under `/memories/`.
view_rangearray
Optional [start_line, end_line] inclusive, 1-indexed. Lets the agent read part of a long file.
vault_capabilitystring
Optional Vault capability: an ed25519 signature (base32-nopad-lc) over blake3("emem.vault_open|"+path+"|"+nonce_bytes), verifiable under the responder pubkey that sealed the entry. When the path is a Vault entry and this verifies, memory_view returns decrypted plaintext; otherwise it returns ciphertext-only. Ignored for non-vault paths.
memory_createWrite a memory file at `/memories/<path>` with the supplied `file_text`. Overwrites if the file exists. Persists to sled, content-addresses the bytes (`file_cid`), and signs the write so the operation carries a verifiable receipt. Mirrors the `create` verb in Anthropic's conte...4 params

Write a memory file at `/memories/<path>` with the supplied `file_text`. Overwrites if the file exists. Persists to sled, content-addresses the bytes (`file_cid`), and signs the write so the operation carries a verifiable receipt. Mirrors the `create` verb in Anthropic's conte...

Parameters* required
kindstring
Optional memory typing tag. Default `resource`. `episodic` = observation; `semantic` = learned fact; `procedural` = playbook; `resource` = generic scratchpad; `vault` = AEAD-sealed secret (stored encrypted; memory_view returns ciphertext-only unless a valid ed25519 capability over blake3("emem.vault_open|"+path+"|"+nonce) is supplied; never indexed by memory_search).one of episodic · semantic · procedural · resource · vault
path*string
`/memories/<file>` path. Overwrites if the file exists. Must stay under `/memories/`.
attesterobject
Optional ed25519 caller binding. Required for writes under `/memories/by_attester/<pubkey8>/...`. Shape: {pubkey_b32, sig_b32} where sig signs blake3("emem.memory_write|create|path|body_hash").
file_text*string
Full file contents.
memory_str_replaceReplace `old_str` with `new_str` in the named memory file. Fails (no partial write) when `old_str` is absent or matches more than once. Writes a new content-addressed `file_cid` and signs the receipt. Mirrors the `str_replace` verb in Anthropic's context-management-2025-06-27...5 params

Replace `old_str` with `new_str` in the named memory file. Fails (no partial write) when `old_str` is absent or matches more than once. Writes a new content-addressed `file_cid` and signs the receipt. Mirrors the `str_replace` verb in Anthropic's context-management-2025-06-27...

Parameters* required
kindstring
Optional memory typing override. If omitted the existing kind is preserved.one of episodic · semantic · procedural · resource
path*string
`/memories/<file>` path the replacement targets.
new_str*string
Replacement substring.
old_str*string
Exact substring to replace. The whole call fails (no partial write) when the old_str is absent or appears more than once.
attesterobject
Optional ed25519 caller binding. See memory_create for the preimage shape (verb=str_replace).
memory_insertInsert `new_str` after the given 1-indexed line in the named memory file. `insert_line: 0` inserts at the top. Writes a new `file_cid` and signs the receipt. Mirrors the `insert` verb in Anthropic's context-management-2025-06-27 memory tool spec. When to use: Call when the LLM...5 params

Insert `new_str` after the given 1-indexed line in the named memory file. `insert_line: 0` inserts at the top. Writes a new `file_cid` and signs the receipt. Mirrors the `insert` verb in Anthropic's context-management-2025-06-27 memory tool spec. When to use: Call when the LLM...

Parameters* required
kindstring
Optional memory typing override. If omitted the existing kind is preserved.one of episodic · semantic · procedural · resource
path*string
`/memories/<file>` path the insertion targets.
new_str*string
Text to insert. A trailing newline is preserved if present; one is added otherwise.
attesterobject
Optional ed25519 caller binding. See memory_create for the preimage shape (verb=insert).
insert_line*integer
1-indexed line number AFTER which to insert. 0 inserts at the top of the file.
memory_deleteDelete a memory file at `/memories/<path>`. When the path ends with `/`, every file beneath the directory is removed. Updates the path index but leaves prior content-addressed blobs in place (the audit history is append-only). Mirrors the `delete` verb in Anthropic's context-m...2 params

Delete a memory file at `/memories/<path>`. When the path ends with `/`, every file beneath the directory is removed. Updates the path index but leaves prior content-addressed blobs in place (the audit history is append-only). Mirrors the `delete` verb in Anthropic's context-m...

Parameters* required
path*string
`/memories/<file>` or `/memories/<subdir>/` to delete. Directories drop every file beneath them.
attesterobject
Optional ed25519 caller binding. Required for `/memories/by_attester/<pubkey8>/...`. Body is empty for delete; sig signs blake3("emem.memory_write|delete|path|body_hash") where body_hash = blake3("").
memory_renameMove (rename) a memory file from `old_path` to `new_path`. Both paths must stay under `/memories/`; `new_path` must not already exist. The file_cid is preserved (no re-sign) so the prior receipt still binds the bytes. Mirrors the `rename` verb in Anthropic's context-management...3 params

Move (rename) a memory file from `old_path` to `new_path`. Both paths must stay under `/memories/`; `new_path` must not already exist. The file_cid is preserved (no re-sign) so the prior receipt still binds the bytes. Mirrors the `rename` verb in Anthropic's context-management...

Parameters* required
attesterobject
Optional ed25519 caller binding (verb=rename). Required when either path is under `/memories/by_attester/<pubkey8>/...`.
new_path*string
Destination `/memories/<file>` path. Fails when the destination exists.
old_path*string
Existing `/memories/<file>` path.
memory_list_by_kindList memory files by their typed `kind` (episodic | semantic | procedural | resource). Optional path prefix narrows the scan; results are sorted by signed_at descending. The kind taxonomy follows the CoALA / LangMem / MIRIX agent-memory ontology: `episodic` = observations of e...3 params

List memory files by their typed `kind` (episodic | semantic | procedural | resource). Optional path prefix narrows the scan; results are sorted by signed_at descending. The kind taxonomy follows the CoALA / LangMem / MIRIX agent-memory ontology: `episodic` = observations of e...

Parameters* required
kind*string
Memory type to enumerate.one of episodic · semantic · procedural · resource
limitinteger
Maximum entries to return (default 256, cap 2048). Results are sorted signed_at desc.
prefixstring
Optional path prefix filter, e.g. `/memories/by_attester/abcd1234/`.
emem_memory_searchSemantic search over /memories/* file contents using BGE-base-en-v1.5 (768-D, L2-normalised) backed by a Lance partition (`memory_text_index_d768.lance`). Matches paraphrases — "rainfall in March" finds "precipitation observed in spring" without an exact substring match. Retur...5 params

Semantic search over /memories/* file contents using BGE-base-en-v1.5 (768-D, L2-normalised) backed by a Lance partition (`memory_text_index_d768.lance`). Matches paraphrases — "rainfall in March" finds "precipitation observed in spring" without an exact substring match. Retur...

Parameters* required
kinteger
Number of hits to return.default: 10
q*string
Free-text query. Semantic — matches paraphrases not just substrings.
kindstring
Optional filter: only files whose typing taxonomy entry matches (defaults to `resource` until Agent W's typing lands).
path_prefixstring
Optional filter: only files whose path starts with this prefix (e.g. `/memories/journal/`).
attester_pubkey_b32string
Optional filter: only files attested by this signer (base32-nopad-lowercase pubkey).
emem_corpus_state_statsSigned snapshot of corpus liveness: distinct_cells, distinct_bands, facts_scanned, top per-band counts, manifest CIDs. Same payload that backs /v1/stream's corpus.state tick (signed). Use this for a one-shot poll instead of holding an SSE connection. When to use: Call when an...

Signed snapshot of corpus liveness: distinct_cells, distinct_bands, facts_scanned, top per-band counts, manifest CIDs. Same payload that backs /v1/stream's corpus.state tick (signed). Use this for a one-shot poll instead of holding an SSE connection. When to use: Call when an...

No parameters — call it with no arguments.

emem_benchmarkHand-verified evaluation items for grading an agent against the responder. Returns {items[], grader_url}. Submit answers (cell64 or fact_cid per item) to POST /v1/benchmark/grade for per-item scores. Items today: elevation recall, NDVI, find_similar neighbours. When to use: Ca...

Hand-verified evaluation items for grading an agent against the responder. Returns {items[], grader_url}. Submit answers (cell64 or fact_cid per item) to POST /v1/benchmark/grade for per-item scores. Items today: elevation recall, NDVI, find_similar neighbours. When to use: Ca...

No parameters — call it with no arguments.

emem_recallRecall facts about a cell — auto-materializes on miss for any band with a registered materializer. When to use: Call after `emem_locate` (or with a known cell64). Returns every Primary fact stored at that (cell, band, tslot). IMPORTANT: if the cell has no fact yet for a reques...7 params

Recall facts about a cell — auto-materializes on miss for any band with a registered materializer. When to use: Call after `emem_locate` (or with a known cell64). Returns every Primary fact stored at that (cell, band, tslot). IMPORTANT: if the cell has no fact yet for a reques...

Parameters* required
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 `band` and `bands` are accepted; if both are given they are merged.
cell*string
cell64 string, e.g. 'damO.zb000.xUti.zde78'
bandsarray
optional band keys to filter, e.g. ['indices.ndvi','geotessera']
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'} sees only u1's facts, never another tenant's and never globally-written facts) AND the signed receipt binds the scope. Omit (or send {}) for the global, pre-v0.0.8 recall.
tslotinteger
optional time slot (band-tempo-relative integer offset from emem epoch)
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_tslot < tslot (rejected with code:`invalid_temporal_bound`).
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:`invalid_signed_at_format`.
emem_recall_polygonRecall facts across every cell inside a place's polygon (single signed envelope). Closes the place-name-drift gap for wide features (parks, lakes, regions). When to use: Call when the user names a wide feature (national park, river basin, country, large urban area) where one c...8 params

Recall facts across every cell inside a place's polygon (single signed envelope). Closes the place-name-drift gap for wide features (parks, lakes, regions). When to use: Call when the user names a wide feature (national park, river basin, country, large urban area) where one c...

Parameters* required
bandsarray
Bands to recall at each fan-out cell.
placestring
Free-text place name; resolved through the layered geocoder. REQUIRED unless `polygon_bbox` is provided.
tslotinteger
includearray
Optional supplements attached to the response. `ftw_fields` adds per-field agricultural-boundary polygons from Fields of The World (https://fieldsofthe.world, CC-BY-4.0) for the resolved polygon bbox — useful for farm queries where the OSM polygon is the estate envelope but the user wants the actual fields inside. Adds ~150-500 ms on first call per region (cached thereafter).
max_cellsinteger
Cap on cells sampled from the polygon.default: 64
as_of_tslotinteger
Bi-temporal valid-time bound — forwarded to every per-cell recall in the fan-out.
polygon_bboxobject
Explicit polygon bbox; alternative to `place` when caller already has coordinates. REQUIRED unless `place` is provided.
as_of_signed_atstring
Bi-temporal transaction-time bound (RFC 3339).
emem_field_boundariesPer-field agricultural-boundary polygons from the Fields of The World global product (~3.17B fields, 241 countries, 10 m resolution, CC-BY-4.0). Returns a GeoJSON FeatureCollection with the polygon geometries, FIBOA-compatible properties, and a planar `area_m2` per field — plu...3 params

Per-field agricultural-boundary polygons from the Fields of The World global product (~3.17B fields, 241 countries, 10 m resolution, CC-BY-4.0). Returns a GeoJSON FeatureCollection with the polygon geometries, FIBOA-compatible properties, and a planar `area_m2` per field — plu...

Parameters* required
zoominteger
Web-Mercator zoom level for the FTW PMTiles read. Default = library-picked min(14, archive.max_zoom). Higher zoom = sharper boundaries but more tiles per query (capped internally at 16 — split very wide farms).
placestring
Free-text place/farm/region name; resolved through the same layered geocoder as /v1/recall_polygon. REQUIRED unless `polygon_bbox` is provided.
polygon_bboxobject
Explicit bbox; alternative to `place`.
emem_query_regionQuery facts over a region (single cell or list of cells), optionally aggregated per band. When to use: Call when the user asks 'how does region X look', 'what's the average NDVI here', or wants a region-level summary. Use `agg=mean|median|p90|vector_centroid` to fold per-band...5 params

Query facts over a region (single cell or list of cells), optionally aggregated per band. When to use: Call when the user asks 'how does region X look', 'what's the average NDVI here', or wants a region-level summary. Use `agg=mean|median|p90|vector_centroid` to fold per-band...

Parameters* required
aggstring
optional per-band aggregationone of mean · median · p90 · vector_centroid
bandsarray
geometry*string
cell64 string, or 'cells:c1,c2,c3'
as_of_tslotinteger
Bi-temporal valid-time bound — applied per cell across the region. See emem_recall for semantics.
as_of_signed_atstring
Bi-temporal transaction-time bound (RFC 3339).
emem_compareCompare two cells: cosine similarity over shared vector bands + per-band scalar deltas. When to use: Call when the user asks 'how similar is X to Y', 'compare these two places', or wants a difference vector. Returns a single cosine score and per-band deltas.3 params

Compare two cells: cosine similarity over shared vector bands + per-band scalar deltas. When to use: Call when the user asks 'how similar is X to Y', 'compare these two places', or wants a difference vector. Returns a single cosine score and per-band deltas.

Parameters* required
a*string
cell64 of cell A
b*string
cell64 of cell B
familystring
optional band-key prefix (e.g. 'indices.')
emem_compare_bandsCompare two bands at the same cell. Scalar pair → metric=delta, value=b-a. Vector pair (equal dim) → metric=cosine + per-dim delta. Returns a signed receipt naming both source fact CIDs. When to use: Call when the user wants cross-source consistency at one place ('does Cop-DEM...6 params

Compare two bands at the same cell. Scalar pair → metric=delta, value=b-a. Vector pair (equal dim) → metric=cosine + per-dim delta. Returns a signed receipt naming both source fact CIDs. When to use: Call when the user wants cross-source consistency at one place ('does Cop-DEM...

Parameters* required
a*string
band A key (e.g. 'copdem30m.elevation_mean')
b*string
band B key (e.g. 'gmrt.topobathy_mean')
cell*string
cell64 (`cell64` accepted as alias)
tslot_ainteger
tslot for band A. Omit to auto-pick the latest attested tslot for this band at this cell — required for medium/fast-tempo bands (NDVI 30-day, MODIS 8-day, weather, CAMS) which have NO fact at tslot=0. The response carries `tslot_resolution.per_band.tslot_used_a` so you see which slot was chosen.
tslot_binteger
tslot for band B. Same auto-pick semantics as `tslot_a` when omitted.
predicateobject
Optional consistency predicate. When set, the response carries a signed `verdict` (true|false|incomparable) over the comparison.
emem_find_similark-NN over the corpus by cell embedding or inline vector. When to use: Call when the user asks 'find places like X', 'where else looks like this', or hands an embedding to find neighbours. `key` is either a cell64 or `inline:[x,y,...]`. Default band is `geotessera` (128-D Tesse...6 params

k-NN over the corpus by cell embedding or inline vector. When to use: Call when the user asks 'find places like X', 'where else looks like this', or hands an embedding to find neighbours. `key` is either a cell64 or `inline:[x,y,...]`. Default band is `geotessera` (128-D Tesse...

Parameters* required
kinteger
default: 10
key*string
cell64 (look up that cell's vector) or 'inline:[x,y,...]' literal vector
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.bin128') — the responder picks the right one.default: geotessera
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 = triage with Hamming on 4·k candidates then re-rank by cosine — matches cosine precision at ~16× less work.one of cosine · hamming · hamming_then_rerankdefault: cosine
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→drop). When set, the Lance ANN fast-path is bypassed (the index has no signed_at column); brute-force k-NN runs instead so as_of is honoured truthfully.
as_of_signed_atstring
Bi-temporal transaction-time bound (RFC 3339). Also applied to candidates BEFORE cosine. Same Lance-bypass note as as_of_tslot.
emem_trajectoryTime series for one (cell, band) over an inclusive [start, end] tslot window. Returns only what's already attested — does NOT trigger materialization. For historical backfill use `emem_backfill`. When to use: Call when the user asks 'how did X change over time' for a band that...5 params

Time series for one (cell, band) over an inclusive [start, end] tslot window. Returns only what's already attested — does NOT trigger materialization. For historical backfill use `emem_backfill`. When to use: Call when the user asks 'how did X change over time' for a band that...

Parameters* required
band*string
cell*string
window*array
[start_tslot, end_tslot] inclusive
as_of_tslotinteger
Bi-temporal valid-time bound. Skips points with tslot > as_of_tslot — effectively clips the window's upper edge.
as_of_signed_atstring
Bi-temporal transaction-time bound (RFC 3339). Restricts the series to facts signed at or before this instant.
emem_diffCompute a DerivativeFact (delta) between a band's values at two tslots. When to use: Call when the user asks 'what changed between t1 and t2', 'give me the delta'. Returns a signed DerivativeFact + receipt — the delta itself is content-addressed and citable.4 params

Compute a DerivativeFact (delta) between a band's values at two tslots. When to use: Call when the user asks 'what changed between t1 and t2', 'give me the delta'. Returns a signed DerivativeFact + receipt — the delta itself is content-addressed and citable.

Parameters* required
band*string
cell*string
tslot_a*integer
tslot_b*integer
emem_memory_contradictionsSurface where the corpus DISAGREES with itself. 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...5 params

Surface where the corpus DISAGREES with itself. 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...

Parameters* required
bandstring
Band key filter (e.g. `indices.ndvi`). Omit to include all bands.
limitinteger
Max contradictions to return.default: 100
cell_prefixstring
Bytewise prefix on cell64 (e.g. `defi.zb5f9`). Omit to scan the whole corpus up to the scan cap.
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).default: 0.1
window_unix_sarray
[lo, hi] inclusive Unix-seconds filter on attestations' signed_at — all disagreeing attestations must fall in the window.
emem_edges_recallRead temporal knowledge-graph edges (subj --pred--> obj, valid over [valid_from, valid_to)), bi-temporally filtered, in EITHER direction. Forward (`subj`, direction="out", the default): edges originating at a subject fact. Reverse (`obj`, direction="in"): edges pointing AT a f...6 params

Read temporal knowledge-graph edges (subj --pred--> obj, valid over [valid_from, valid_to)), bi-temporally filtered, in EITHER direction. Forward (`subj`, direction="out", the default): edges originating at a subject fact. Reverse (`obj`, direction="in"): edges pointing AT a f...

Parameters* required
objstring
Object fact CID (reverse, direction="in"): edges TERMINATING at this fact ("what points at this fact" — what disagrees-with / supersedes / relates-to it) are returned. Set exactly one of `subj` or `obj`.
predstring
Predicate filter (e.g. `replaced_by`, `disagrees_with`, `supersedes`, `co_located_with`). Empty string (default) scans every predicate for the anchor fact.
subjstring
Subject fact CID (forward, direction="out"): edges ORIGINATING at this fact ("what does this fact point at") are returned. Set exactly one of `subj` or `obj`.
limitinteger
Max edges to return.default: 100
directionstring
Traversal direction. "out" (default) = subj→objs; "in" = obj→subjs. Inferred from which of subj/obj you set when omitted; an ambiguous (both set) or empty (neither set) request is rejected with an honest error, never a silent empty.one of out · in
as_of_tslotinteger
Valid-time bound. Returns the latest edge per neighbour whose [valid_from, valid_to) interval covers this tslot; supersession keeps the newest edge. Omit for all edges regardless of valid-time.
emem_fetchFetch a fact by its content-address (CID). Returns the full signed Primary or Absence fact — the same body served by REST `/v1/facts/{cid}`. Closes the citation loop: any fact_cid surfaced by recall, materialize, attest, or verify can be re-resolved by another agent without RE...1 params

Fetch a fact by its content-address (CID). Returns the full signed Primary or Absence fact — the same body served by REST `/v1/facts/{cid}`. Closes the citation loop: any fact_cid surfaced by recall, materialize, attest, or verify can be re-resolved by another agent without RE...

Parameters* required
cid*string
Content-address of any persisted fact (Primary or Absence). Returned by every recall, attest, materialize, and verify call as `fact_cid` / `fact_cids`.
emem_backfillMaterialize and sign every per-tslot fact for one (cell, band) inside a [start_unix, end_unix] window. Returns a signed list of (tslot, fact_cid, status) for each step. Slow but possible — one upstream fetch per tslot, capped by `max_facts`. When to use: Call when the user wan...5 params

Materialize and sign every per-tslot fact for one (cell, band) inside a [start_unix, end_unix] window. Returns a signed list of (tslot, fact_cid, status) for each step. Slow but possible — one upstream fetch per tslot, capped by `max_facts`. When to use: Call when the user wan...

Parameters* required
band*string
Band key. Must be a band whose materializer supports historical fetch — see `emem_coverage_matrix` field `history_available_from`/`history_available_to`.
cell*string
cell64 or place name (auto-resolved).
end_unixinteger
Window end as Unix epoch seconds (UTC). Defaults to now.
max_factsinteger
Cap on number of facts materialized in one call.default: 64
start_unixinteger
Window start as Unix epoch seconds (UTC). Defaults to the band's `history_available_from`.
emem_heat_solveForward-step 2-D explicit finite-difference solver for the heat equation ∂u/∂t = α∇²u over a 3×3 cell stencil centred on `cell`. Reads `modis.lst_day_8day` (Land Surface Temperature) at the centre and 8 cell64 neighbours, integrates N hours ahead under a CFL-stable timestep, r...3 params

Forward-step 2-D explicit finite-difference solver for the heat equation ∂u/∂t = α∇²u over a 3×3 cell stencil centred on `cell`. Reads `modis.lst_day_8day` (Land Surface Temperature) at the centre and 8 cell64 neighbours, integrates N hours ahead under a CFL-stable timestep, r...

Parameters* required
cell*string
cell64 string. Forecast LST evolution at this cell.
hours_aheadnumber
Forecast horizon in hours; capped at 168 (one week).default: 6
diffusivity_m2_per_snumber
Thermal diffusivity α (m²/s). Default urban surface (Oke 2017 §2.3); use ~5e-7 for vegetation, ~1.4e-7 for water.default: 0.000001
emem_wave_solveForward-step 1-D explicit finite-difference solver for the shallow-water wave equation ∂²u/∂t² = c²∂²u/∂x² with c² = g·h, where depth h comes from `gmrt.topobathy_mean` along the seaward gradient. Models how an offshore swell of height H_s and period T propagates toward `coast...4 params

Forward-step 1-D explicit finite-difference solver for the shallow-water wave equation ∂²u/∂t² = c²∂²u/∂x² with c² = g·h, where depth h comes from `gmrt.topobathy_mean` along the seaward gradient. Models how an offshore swell of height H_s and period T propagates toward `coast...

Parameters* required
period_s*number
Wave period (s); typical wind-wave + swell envelope is 6-18 s.
coastal_cell*string
cell64 of the coastal destination.
n_offshore_cellsinteger
Cells to sample seaward when building the bathymetric profile.default: 8
offshore_height_m*number
Offshore significant wave height H_s (m).
emem_jepa_predictPredict next-month NDVI at a cell using a constrained JEPA-pattern AR(2) seasonal predictor. Reads up to 24 past months of `indices.ndvi`, fits a closed-form predictor `y_{t+1} = α·(lag-12 NDVI or recent mean) + β·(last + slope) + γ·recent_mean`, returns the prediction clamped...4 params

Predict next-month NDVI at a cell using a constrained JEPA-pattern AR(2) seasonal predictor. Reads up to 24 past months of `indices.ndvi`, fits a closed-form predictor `y_{t+1} = α·(lag-12 NDVI or recent mean) + β·(last + slope) + γ·recent_mean`, returns the prediction clamped...

Parameters* required
bandstring
Band to forecast. v1 supports 'indices.ndvi' only.default: indices.ndvi
cell*string
cell64 to forecast at.
lookback_monthsinteger
How many past months of history to read.default: 6
forecast_horizon_monthsinteger
Horizon in months ahead. v1 supports 1 only.default: 1
emem_jepa_predict_v2Predict the next-step value of 4 environmental scalars at a cell — `indices.ndvi`, `modis.lst_day_8day`, `modis.lst_night_8day`, `cams.pm25` — using a small learned dynamics MLP. Reads up to K=6 most-recent attested lags per band, runs them through an ONNX dynamics head (~200k...1 params

Predict the next-step value of 4 environmental scalars at a cell — `indices.ndvi`, `modis.lst_day_8day`, `modis.lst_night_8day`, `cams.pm25` — using a small learned dynamics MLP. Reads up to K=6 most-recent attested lags per band, runs them through an ONNX dynamics head (~200k...

Parameters* required
cell*string
cell64 to forecast at, or a free-text place name (auto-resolved via /v1/locate).
emem_verifyVerify a structured claim against a cell's facts. Returns verdict + evidence CIDs + signed receipt. When to use: Call when the user asks a yes/no question about a cell ('is the NDVI > 0.7 here', 'has this been deforested'), or when downstream code wants citable evidence for a...3 params

Verify a structured claim against a cell's facts. Returns verdict + evidence CIDs + signed receipt. When to use: Call when the user asks a yes/no question about a cell ('is the NDVI > 0.7 here', 'has this been deforested'), or when downstream code wants citable evidence for a...

Parameters* required
cell*string
modestring
one of fast · resolvedefault: fast
claim*object
emem_bandsActive band ontology (offsets, dims, tempo, privacy). When to use: Call once at session start to learn the band registry — every other primitive's `band` argument MUST come from this list.

Active band ontology (offsets, dims, tempo, privacy). When to use: Call once at session start to learn the band registry — every other primitive's `band` argument MUST come from this list.

No parameters — call it with no arguments.

emem_functionsActive function registry (derivation recipes). When to use: Call when you need to know which derivative ops are available for `emem_diff` or how a band is computed from upstream sources.

Active function registry (derivation recipes). When to use: Call when you need to know which derivative ops are available for `emem_diff` or how a band is computed from upstream sources.

No parameters — call it with no arguments.

emem_sourcesActive source-connector registry (URL templates, providers, licenses). When to use: Call when you need to inspect which upstream EO providers are wired (Copernicus DEM, JRC GSW, ESA WorldCover, etc.) — useful for license attribution in agent answers.

Active source-connector registry (URL templates, providers, licenses). When to use: Call when you need to inspect which upstream EO providers are wired (Copernicus DEM, JRC GSW, ESA WorldCover, etc.) — useful for license attribution in agent answers.

No parameters — call it with no arguments.

emem_schemaActive CDDL/JSON schema bundle by CID. When to use: Rarely needed at chat time. Useful for offline verification of receipts / attestations against the exact schema version a responder used.

Active CDDL/JSON schema bundle by CID. When to use: Rarely needed at chat time. Useful for offline verification of receipts / attestations against the exact schema version a responder used.

No parameters — call it with no arguments.

emem_errorsStable error code catalog. When to use: Call to enumerate the wire-stable error codes — useful when the LLM wants to programmatically branch on responses.

Stable error code catalog. When to use: Call to enumerate the wire-stable error codes — useful when the LLM wants to programmatically branch on responses.

No parameters — call it with no arguments.

emem_manifestsActive manifest CIDs (bands / functions / sources / schema). When to use: Call to learn which exact registry versions a responder is serving. Cite these CIDs alongside any answer where reproducibility matters.

Active manifest CIDs (bands / functions / sources / schema). When to use: Call to learn which exact registry versions a responder is serving. Cite these CIDs alongside any answer where reproducibility matters.

No parameters — call it with no arguments.

emem_capabilitiesLive capability snapshot of the responder's GPU sidecar — extensions[] (e.g. gpu, clay-v1.5, prithvi-eo2), cuda_available, models_loaded[], healthy, last_polled_unix_s. Refreshed every 30 s by a background poller; reads are constant-time. When to use: Call before scheduling a...

Live capability snapshot of the responder's GPU sidecar — extensions[] (e.g. gpu, clay-v1.5, prithvi-eo2), cuda_available, models_loaded[], healthy, last_polled_unix_s. Refreshed every 30 s by a background poller; reads are constant-time. When to use: Call before scheduling a...

No parameters — call it with no arguments.

emem_grid_infoActive grid encoding: cell64 ground resolution, lat/lng axis sizes, DGGS lineage. When to use: Call once at session start (or when the user asks about cell resolution / 'how big is a cell'). Returns the actual ground resolution today (~9.54 m × 9.55 m square at the equator (la...

Active grid encoding: cell64 ground resolution, lat/lng axis sizes, DGGS lineage. When to use: Call once at session start (or when the user asks about cell resolution / 'how big is a cell'). Returns the actual ground resolution today (~9.54 m × 9.55 m square at the equator (la...

No parameters — call it with no arguments.

emem_coverage_matrixPer-band live status — what data is alive AND auto-materializable, with history bounds, tempo cadence, and the responder pubkey that signs the band. When to use: Call BEFORE `emem_recall` when you don't know which bands answer at this responder. For each band returns `has_mate...

Per-band live status — what data is alive AND auto-materializable, with history bounds, tempo cadence, and the responder pubkey that signs the band. When to use: Call BEFORE `emem_recall` when you don't know which bands answer at this responder. For each band returns `has_mate...

No parameters — call it with no arguments.

emem_materializersAuto-fetch registry: which bands the responder will materialize on a recall miss, the upstream provider, license, value shape, and history bounds. When to use: Call once at session start (alongside `emem_bands` and `emem_coverage_matrix`) to learn which bands answer for ANY ce...

Auto-fetch registry: which bands the responder will materialize on a recall miss, the upstream provider, license, value shape, and history bounds. When to use: Call once at session start (alongside `emem_bands` and `emem_coverage_matrix`) to learn which bands answer for ANY ce...

No parameters — call it with no arguments.

emem_data_availabilityTemporal catalog: for every materializable band the upstream-of-record window the data genuinely covers, the temporal `kind` (static | annual_snapshot | annual_stack | time_series | now_only | per_release), tempo seconds, upstream wire path, and whether `emem_backfill` is mean...

Temporal catalog: for every materializable band the upstream-of-record window the data genuinely covers, the temporal `kind` (static | annual_snapshot | annual_stack | time_series | now_only | per_release), tempo seconds, upstream wire path, and whether `emem_backfill` is mean...

No parameters — call it with no arguments.

emem_algorithmsContent-addressed dictionary of composition recipes — formulas that fuse attested band facts (and embeddings) into derived scores, classifications, and similarity metrics. When to use: Call when the user's question is COMPOSITE (flood risk, urban density, water consensus, chan...

Content-addressed dictionary of composition recipes — formulas that fuse attested band facts (and embeddings) into derived scores, classifications, and similarity metrics. When to use: Call when the user's question is COMPOSITE (flood risk, urban density, water consensus, chan...

No parameters — call it with no arguments.

emem_explain_algorithmPer-key drill-down on a single composition recipe — full body (kind, inputs, formula, output, citation, references) for ONE algorithm key. Companion to `emem_algorithms` (which is the catalog). When to use: Call when you already know the algorithm key (from `emem_algorithms`'s...1 params

Per-key drill-down on a single composition recipe — full body (kind, inputs, formula, output, citation, references) for ONE algorithm key. Companion to `emem_algorithms` (which is the catalog). When to use: Call when you already know the algorithm key (from `emem_algorithms`'s...

Parameters* required
key*string
Algorithm key including version suffix, e.g. `walkability_score@1`. Get the live key list from `emem_algorithms`.
emem_topicsTopic-grouped registry of every band and algorithm at this responder, plus visual surfaces and the `declared_but_no_materializer_at_this_responder` block (cube slots reserved without a live connector). Single source of truth shared with `/v1/locate`'s `data_at_this_cell` block...

Topic-grouped registry of every band and algorithm at this responder, plus visual surfaces and the `declared_but_no_materializer_at_this_responder` block (cube slots reserved without a live connector). Single source of truth shared with `/v1/locate`'s `data_at_this_cell` block...

No parameters — call it with no arguments.

emem_coverage_mapLive SVG render of the responder's corpus density, returned as a proper MCP EmbeddedResource content block (image/svg+xml) — multimodal MCP agents can render it natively. When to use: Call when the user asks 'where do you have data?', 'show me the coverage', or wants a visual...

Live SVG render of the responder's corpus density, returned as a proper MCP EmbeddedResource content block (image/svg+xml) — multimodal MCP agents can render it natively. When to use: Call when the user asks 'where do you have data?', 'show me the coverage', or wants a visual...

No parameters — call it with no arguments.

emem_cell_scene_rgbTrue-colour Sentinel-2 L2A RGB thumbnail centred on a cell. PNG returned as a native MCP ImageContent block (mimeType image/png). Pure-Rust pipeline: STAC search + HTTP-Range COG reads + 2-98 percentile stretch + PNG encode. When to use: Call when the user wants a VISUAL of a...3 params

True-colour Sentinel-2 L2A RGB thumbnail centred on a cell. PNG returned as a native MCP ImageContent block (mimeType image/png). Pure-Rust pipeline: STAC search + HTTP-Range COG reads + 2-98 percentile stretch + PNG encode. When to use: Call when the user wants a VISUAL of a...

Parameters* required
cell*string
cell64 or place name
datetimestring
RFC 3339 interval; defaults to last 90 days
max_cloudnumber
max eo:cloud_cover percentdefault: 20
emem_cell_geojsonCell polygon as a native MCP EmbeddedResource (mimeType application/geo+json). Properties carry centre lat/lng, bbox, approx size in metres, and the 8-cell neighbourhood — drop straight into Mapbox / Leaflet / Deck.gl / QGIS without a GIS pipeline. When to use: Call when the a...1 params

Cell polygon as a native MCP EmbeddedResource (mimeType application/geo+json). Properties carry centre lat/lng, bbox, approx size in metres, and the 8-cell neighbourhood — drop straight into Mapbox / Leaflet / Deck.gl / QGIS without a GIS pipeline. When to use: Call when the a...

Parameters* required
cell*string
cell64 or place name
emem_recall_manyRecall facts across a list of up to 256 cell64 strings in one signed envelope. Server fans out per-cell recalls in parallel, then aggregates the response. Auto-materializes any cell with a missing fact whose band has a registered materializer — same contract as emem_recall. Wh...4 params

Recall facts across a list of up to 256 cell64 strings in one signed envelope. Server fans out per-cell recalls in parallel, then aggregates the response. Auto-materializes any cell with a missing fact whose band has a registered materializer — same contract as emem_recall. Wh...

Parameters* required
bandstring
Optional single band override (alias for bands:[band]).
bandsarray
Optional band filter — same shape as emem_recall.bands.
cells*array
List of cell64 strings, max 256. Each cell is recalled in parallel and the responses are merged into a single signed envelope.
tslotinteger
Optional tslot offset.
emem_elevationOne-shot elevation answer that fuses Cop-DEM 30 m (land), GMRT (ocean topobathy), and ESA WorldCover (water mask) into a single signed scalar at a place or coordinate. Returns `elevation_m`, the source actually used, and a `coherence_note` when the two surfaces disagree at the...4 params

One-shot elevation answer that fuses Cop-DEM 30 m (land), GMRT (ocean topobathy), and ESA WorldCover (water mask) into a single signed scalar at a place or coordinate. Returns `elevation_m`, the source actually used, and a `coherence_note` when the two surfaces disagree at the...

Parameters* required
latnumber
WGS-84 latitude.
lngnumber
WGS-84 longitude.
cellstring
cell64 string — skip geocoding entirely.
placestring
Free-text place name. Resolved through the standard locate cascade. Provide this OR `lat`+`lng` OR `cell`.
emem_fleetPer-band satellite-and-sensor fleet inventory — names the upstream platform (e.g. Sentinel-2A/B, MODIS Aqua/Terra, Landsat-8/9), revisit cadence, native resolution, and license for every materialized band. Lets an agent attribute imagery products correctly and pick the right b...

Per-band satellite-and-sensor fleet inventory — names the upstream platform (e.g. Sentinel-2A/B, MODIS Aqua/Terra, Landsat-8/9), revisit cadence, native resolution, and license for every materialized band. Lets an agent attribute imagery products correctly and pick the right b...

No parameters — call it with no arguments.

emem_temporal_routeTurn a time-shaped question into a ready-to-run recall plan: it figures out WHICH bands to pull at WHICH past time windows (e.g. 'the year before the flood', 'last growing season', 'two vintages to compare') so you don't have to compute tslot offsets by hand. Returns the band...5 params

Turn a time-shaped question into a ready-to-run recall plan: it figures out WHICH bands to pull at WHICH past time windows (e.g. 'the year before the flood', 'last growing season', 'two vintages to compare') so you don't have to compute tslot offsets by hand. Returns the band...

Parameters* required
cell*string
cell64 to plan a temporal recall over.
bandsarray
Optional band filter to scope the planner.
limitinteger
Optional cap on recipe entries returned.
intentstring
Optional intent hint — drives recipe selection (e.g. 'flood_window', 'crop_season', 'change_year').
query_timeinteger
Optional anchor time (Unix epoch seconds). Defaults to now.
emem_verify_receiptVerify a signed receipt envelope server-side: recomputes the canonical preimage (`request_id | served_at | primitive | cells, | fact_cids,`), runs ed25519 over the embedded pubkey + signature, and returns `{valid, reason, pubkey_b32}`. Use when the in-browser /verify path is b...2 params

Verify a signed receipt envelope server-side: recomputes the canonical preimage (`request_id | served_at | primitive | cells, | fact_cids,`), runs ed25519 over the embedded pubkey + signature, and returns `{valid, reason, pubkey_b32}`. Use when the in-browser /verify path is b...

Parameters* required
receipt*object
The signed receipt envelope (as returned by any read primitive). Must carry primitive/served_at/request_id/cells/fact_cids and either `signature` byte[] + `responder_pubkey` byte[] or their b32 string forms.
pubkey_b32string
Optional explicit responder pubkey (base32). When omitted, uses the receipt's embedded pubkey/responder fields.
emem_atOne-shot multi-band recall at a place (or lat/lng). Defaults to emem's standard at-a-glance band set; pass `band` / `bands` to override. Polygon-resolved places stay at the centroid by default (`n_cells: 1`) to keep multi-band calls cheap — pass `n_cells: 2..=64` to fan out. W...8 params

One-shot multi-band recall at a place (or lat/lng). Defaults to emem's standard at-a-glance band set; pass `band` / `bands` to override. Polygon-resolved places stay at the centroid by default (`n_cells: 1`) to keep multi-band calls cheap — pass `n_cells: 2..=64` to fan out. W...

Parameters* required
latnumber
WGS-84 latitude. Paired with `lng`. Use when you already have coordinates.
lngnumber
WGS-84 longitude. Paired with `lat`.
bandstring
Optional single band override — replaces the endpoint's default band set with this one.
bandsstring
Optional CSV of band keys — replaces the endpoint's default band set.
placestring
Free-text place name. Resolved through the standard /v1/locate cascade (wide-bbox → embedded → GeoNames → cache → Photon → Nominatim). Provide this OR `lat`+`lng`.
tslotinteger
Optional tslot offset (band-tempo-relative).
includearray
Opt-in heavy response sections. Default response omits per-cell arrays to stay under MCP's 25 KB cap. Name specific sections to include them.
n_cellsinteger
Polygon fan-out width. `n_cells: 1` = point at centroid. Defaults vary per endpoint (1 for /v1/at, 16 for single-band endpoints).
emem_ndviRecall Sentinel-2 NDVI (indices.ndvi, 10 m native) at a point or place. Composes locate → cell64 → recall in one call; auto-materializes on miss. When to use: Use when the user names a place (or lat/lng) and just wants the NDVI number. Polygon-resolved places default to a 16-c...8 params

Recall Sentinel-2 NDVI (indices.ndvi, 10 m native) at a point or place. Composes locate → cell64 → recall in one call; auto-materializes on miss. When to use: Use when the user names a place (or lat/lng) and just wants the NDVI number. Polygon-resolved places default to a 16-c...

Parameters* required
latnumber
WGS-84 latitude. Paired with `lng`. Use when you already have coordinates.
lngnumber
WGS-84 longitude. Paired with `lat`.
bandstring
Optional single band override — replaces the endpoint's default band set with this one.
bandsstring
Optional CSV of band keys — replaces the endpoint's default band set.
placestring
Free-text place name. Resolved through the standard /v1/locate cascade (wide-bbox → embedded → GeoNames → cache → Photon → Nominatim). Provide this OR `lat`+`lng`.
tslotinteger
Optional tslot offset (band-tempo-relative).
includearray
Opt-in heavy response sections. Default response omits per-cell arrays to stay under MCP's 25 KB cap. Name specific sections to include them.
n_cellsinteger
Polygon fan-out width. `n_cells: 1` = point at centroid. Defaults vary per endpoint (1 for /v1/at, 16 for single-band endpoints).
emem_airRecall Copernicus CAMS air-quality bands at a place: PM2.5 + NO2 + O3. Composes locate → recall → aggregate. When to use: Use when the user names a place and asks about air quality, pollution, or emissions exposure. CAMS is the European reanalysis — global coverage, ~0.4° nati...8 params

Recall Copernicus CAMS air-quality bands at a place: PM2.5 + NO2 + O3. Composes locate → recall → aggregate. When to use: Use when the user names a place and asks about air quality, pollution, or emissions exposure. CAMS is the European reanalysis — global coverage, ~0.4° nati...

Parameters* required
latnumber
WGS-84 latitude. Paired with `lng`. Use when you already have coordinates.
lngnumber
WGS-84 longitude. Paired with `lat`.
bandstring
Optional single band override — replaces the endpoint's default band set with this one.
bandsstring
Optional CSV of band keys — replaces the endpoint's default band set.
placestring
Free-text place name. Resolved through the standard /v1/locate cascade (wide-bbox → embedded → GeoNames → cache → Photon → Nominatim). Provide this OR `lat`+`lng`.
tslotinteger
Optional tslot offset (band-tempo-relative).
includearray
Opt-in heavy response sections. Default response omits per-cell arrays to stay under MCP's 25 KB cap. Name specific sections to include them.
n_cellsinteger
Polygon fan-out width. `n_cells: 1` = point at centroid. Defaults vary per endpoint (1 for /v1/at, 16 for single-band endpoints).
emem_lstRecall MODIS land surface temperature day-8day + night-8day composites at a place. 1 km native, 8-day composite. When to use: Use when the user asks about surface heat, urban heat island, thermal anomalies, or wants day/night LST. Returns both fluxes so the agent can derive da...8 params

Recall MODIS land surface temperature day-8day + night-8day composites at a place. 1 km native, 8-day composite. When to use: Use when the user asks about surface heat, urban heat island, thermal anomalies, or wants day/night LST. Returns both fluxes so the agent can derive da...

Parameters* required
latnumber
WGS-84 latitude. Paired with `lng`. Use when you already have coordinates.
lngnumber
WGS-84 longitude. Paired with `lat`.
bandstring
Optional single band override — replaces the endpoint's default band set with this one.
bandsstring
Optional CSV of band keys — replaces the endpoint's default band set.
placestring
Free-text place name. Resolved through the standard /v1/locate cascade (wide-bbox → embedded → GeoNames → cache → Photon → Nominatim). Provide this OR `lat`+`lng`.
tslotinteger
Optional tslot offset (band-tempo-relative).
includearray
Opt-in heavy response sections. Default response omits per-cell arrays to stay under MCP's 25 KB cap. Name specific sections to include them.
n_cellsinteger
Polygon fan-out width. `n_cells: 1` = point at centroid. Defaults vary per endpoint (1 for /v1/at, 16 for single-band endpoints).
emem_soilRecall SoilGrids 250 m profile at a place: SOC, pH, clay/sand/silt fractions, bulk density, nitrogen — all at 0–30 cm depth. When to use: Use when the user asks about soil quality, agricultural suitability, or carbon stocks at a location. Six bands returned in one envelope.8 params

Recall SoilGrids 250 m profile at a place: SOC, pH, clay/sand/silt fractions, bulk density, nitrogen — all at 0–30 cm depth. When to use: Use when the user asks about soil quality, agricultural suitability, or carbon stocks at a location. Six bands returned in one envelope.

Parameters* required
latnumber
WGS-84 latitude. Paired with `lng`. Use when you already have coordinates.
lngnumber
WGS-84 longitude. Paired with `lat`.
bandstring
Optional single band override — replaces the endpoint's default band set with this one.
bandsstring
Optional CSV of band keys — replaces the endpoint's default band set.
placestring
Free-text place name. Resolved through the standard /v1/locate cascade (wide-bbox → embedded → GeoNames → cache → Photon → Nominatim). Provide this OR `lat`+`lng`.
tslotinteger
Optional tslot offset (band-tempo-relative).
includearray
Opt-in heavy response sections. Default response omits per-cell arrays to stay under MCP's 25 KB cap. Name specific sections to include them.
n_cellsinteger
Polygon fan-out width. `n_cells: 1` = point at centroid. Defaults vary per endpoint (1 for /v1/at, 16 for single-band endpoints).
emem_waterRecall surface-water signals at a place: JRC Global Surface Water recurrence (1984–2021) + Sentinel-1 SAR backscatter (current). Pair detects standing water through clouds. When to use: Use when the user asks about flooding, wetlands, surface-water dynamics, or wants a robust...8 params

Recall surface-water signals at a place: JRC Global Surface Water recurrence (1984–2021) + Sentinel-1 SAR backscatter (current). Pair detects standing water through clouds. When to use: Use when the user asks about flooding, wetlands, surface-water dynamics, or wants a robust...

Parameters* required
latnumber
WGS-84 latitude. Paired with `lng`. Use when you already have coordinates.
lngnumber
WGS-84 longitude. Paired with `lat`.
bandstring
Optional single band override — replaces the endpoint's default band set with this one.
bandsstring
Optional CSV of band keys — replaces the endpoint's default band set.
placestring
Free-text place name. Resolved through the standard /v1/locate cascade (wide-bbox → embedded → GeoNames → cache → Photon → Nominatim). Provide this OR `lat`+`lng`.
tslotinteger
Optional tslot offset (band-tempo-relative).
includearray
Opt-in heavy response sections. Default response omits per-cell arrays to stay under MCP's 25 KB cap. Name specific sections to include them.
n_cellsinteger
Polygon fan-out width. `n_cells: 1` = point at centroid. Defaults vary per endpoint (1 for /v1/at, 16 for single-band endpoints).
emem_forestRecall forest signals at a place: Hansen Global Forest Change (tree cover 2000 baseline + year-of-loss) + ESA WorldCover 2021 land class. When to use: Use when the user asks about deforestation, canopy cover, forest loss, or wants a forest-vs-not classification. Hansen gives y...8 params

Recall forest signals at a place: Hansen Global Forest Change (tree cover 2000 baseline + year-of-loss) + ESA WorldCover 2021 land class. When to use: Use when the user asks about deforestation, canopy cover, forest loss, or wants a forest-vs-not classification. Hansen gives y...

Parameters* required
latnumber
WGS-84 latitude. Paired with `lng`. Use when you already have coordinates.
lngnumber
WGS-84 longitude. Paired with `lat`.
bandstring
Optional single band override — replaces the endpoint's default band set with this one.
bandsstring
Optional CSV of band keys — replaces the endpoint's default band set.
placestring
Free-text place name. Resolved through the standard /v1/locate cascade (wide-bbox → embedded → GeoNames → cache → Photon → Nominatim). Provide this OR `lat`+`lng`.
tslotinteger
Optional tslot offset (band-tempo-relative).
includearray
Opt-in heavy response sections. Default response omits per-cell arrays to stay under MCP's 25 KB cap. Name specific sections to include them.
n_cellsinteger
Polygon fan-out width. `n_cells: 1` = point at centroid. Defaults vary per endpoint (1 for /v1/at, 16 for single-band endpoints).
emem_weatherRecall the standard met.no/CAMS weather bundle at a place: 2 m temperature + total cloud cover + precipitation + 10 m wind speed. When to use: Use when the user names a place and asks 'what's the weather' or wants a now-cast snapshot. weather.* bands are now-only (no backfill)...8 params

Recall the standard met.no/CAMS weather bundle at a place: 2 m temperature + total cloud cover + precipitation + 10 m wind speed. When to use: Use when the user names a place and asks 'what's the weather' or wants a now-cast snapshot. weather.* bands are now-only (no backfill)...

Parameters* required
latnumber
WGS-84 latitude. Paired with `lng`. Use when you already have coordinates.
lngnumber
WGS-84 longitude. Paired with `lat`.
bandstring
Optional single band override — replaces the endpoint's default band set with this one.
bandsstring
Optional CSV of band keys — replaces the endpoint's default band set.
placestring
Free-text place name. Resolved through the standard /v1/locate cascade (wide-bbox → embedded → GeoNames → cache → Photon → Nominatim). Provide this OR `lat`+`lng`.
tslotinteger
Optional tslot offset (band-tempo-relative).
includearray
Opt-in heavy response sections. Default response omits per-cell arrays to stay under MCP's 25 KB cap. Name specific sections to include them.
n_cellsinteger
Polygon fan-out width. `n_cells: 1` = point at centroid. Defaults vary per endpoint (1 for /v1/at, 16 for single-band endpoints).
emem globe, a slowly rotating view of Earth

emem

The verifiable memory protocol for the physical world, built for AI agents to cite.

Agents inherit a measured, signed account of the physical world instead of re-observing it; every observation becomes a shared, verifiable Memory Token that persists across long-horizon AI tasks.

ci release last commit License: Apache-2.0 Rust 1.91 MCP: Streamable HTTP OpenAPI 3.1 Whitepaper: Zenodo Container: ghcr.io

Walk the memory in 3-D · Try it, no key · Verify a fact · Agent guide


What is emem

A shared memory of the physical world, and a systems primitive for agents: memory that lives outside any one model, so an agent cites a fact instead of carrying a paraphrase of it. Location is the first key: every place on Earth has a stable 64-bit address, and every observation recorded there, an elevation, a temperature, a forest-loss year, is one signed, immutable record at that address. Any agent can read it, any keyholder can add to it, and anyone can check any of it offline. No account to read.

Satellite Earth observation fills it today; nothing in the record, receipt, or token grammar is satellite-specific, so the same loop carries any observer of a place (substrates). If you build agents, robot fleets, or anything else that must hold a fact longer than one context window, this is for you.

The failure it removes

An agent verifies something early, the context gets compacted, and what survives is a paraphrase that is almost right:

without emem
  turn 12   the agent verifies a value: 918 m
  turn 40   the context is compacted
  turn 41   what survives: "the site sits at roughly 900 m"

with emem
  turn 12   the agent keeps one line:
            emem:fact:defi.zb493.xuqA.zcb5f:yqbolgeoycqkvj3zkxukb4bjw4odhpwvfzqo3fbgwf4spk45zala
  turn 40   the context is compacted
  turn 41   the line resolves to 918.0 m, and the signature still checks

One line, about 50 BPE tokens, standing in for a signed record of about 1,600. A paraphrase drifts; the token re-hydrates to the exact bytes for any agent, on any model, any month later. And that token is real: it names the fact the next section verifies.

One call, one verified fact

Reading needs no key and no account. This returns the elevation at one 10-metre cell of Bengaluru, as a signed record:

curl -s -X POST https://emem.dev/v1/recall \
  -H 'content-type: application/json' \
  -d '{"place":"Bengaluru","bands":["copdem30m.elevation_mean"]}'

A band names one measurement; this one is mean elevation from the Copernicus DEM. The response carries the value (918 metres), the record's content id (fact_cid), and an ed25519 receipt.

The response, trimmed: what a stored fact actually holds
{
  "facts": [{
    "band": "copdem30m.elevation_mean",
    "cell": "defi.zb493.xuqA.zcb5f",
    "value": 918.0,
    "unit": "m",
    "kind": "primary",
    "confidence": 0.95,
    "derivation": { "fn_key": "open_meteo_copdem90m@1", "args": [12.9719, 77.5937] },
    "sources": [{ "scheme": "open_meteo", "captured_at": "2021-04-30T00:00:00Z", "id": "https://api.open-meteo.com/v1/elevation?…" }],
    "signed_at": "2026-05-28T19:54:32Z",
    "signer_pubkey_b32": "777er3yihgifqmv5hmc2wwmyszgddzderzhsx6rex4yoakwomvka",
    "fact_cid": "yqbolgeoycqkvj3zkxukb4bjw4odhpwvfzqo3fbgwf4spk45zala",
    "memory_token": "emem:fact:defi.zb493.xuqA.zcb5f:yqbolgeo…zala"
  }],
  "receipt": { "primitive": "emem.recall", "fact_cids": ["yqbolgeo…"], "merkle_proof": {…}, "signature": "…", "responder_pubkey_b32": "…" }
}

No documents and no blobs: a fact is one small signed value carrying its own provenance, the function and source it is recomputable from. Even embeddings arrive this way, as bands whose record names the model checkpoint.

One more paste checks that receipt against the responder's published key, so you are not trusting the server or this README:

curl -s -X POST https://emem.dev/v1/recall -H 'content-type: application/json' \
  -d '{"place":"Bengaluru","bands":["copdem30m.elevation_mean"]}' \
  | jq '{receipt: .receipt}' \
  | curl -s -X POST https://emem.dev/v1/verify_receipt \
      -H 'content-type: application/json' --data-binary @- \
  | jq '{signature_valid, merkle_proof_valid}'

"signature_valid": true. That is the whole trust model in two commands: every reading is a signed record, and anyone can check one. If that worked, the star button helps other builders find this. The line an agent keeps instead of the payload is next.

From your agent to a token: the agent speaks MCP or REST into the same handlers, recall answers from memory or fetches open sources once, the observation becomes a signed fact, and what the agent keeps is one 84-character memory token that resolves anywhere.

The ladder

Six steps, each adding one idea, and every step works before the next exists:

  1. Read. Recall signed facts for any place, no key, no account: two minutes.
  2. Cite. Keep the 84-character token, drop the payload: the Memory Token.
  3. Verify. Re-check a token's bytes and signature offline, trusting nobody: why you can trust it.
  4. Write. Attest your own facts with a local ed25519 key, no registration: if you are an agent.
  5. Self-host. Run the exact hosted binary; a receipt minted on one node verifies on the other: run your own node.
  6. Federate. Several independent responders, one address space. Next, not now: docs/roadmap.md.

The Memory Token

emem:fact:defi.zb493.xuqA.zcb5f:yqbolgeoycqkvj3zkxukb4bjw4odhpwvfzqo3fbgwf4spk45zala

One line: the address of a place plus the fingerprint of one signed observation there. It is 84 characters, about 50 BPE tokens; the full signed record it stands in for is about 1,600. An agent keeps the line and drops the payload. Any agent, any model, any month later resolves the line back to the exact same bytes and re-checks the signature without trusting whoever sent it.

In practice your agent runs four verbs: locate a place, recall its signed facts, reason over them, and cite the tokens in its output. Verification is the receiver's single call.

Where it sits in your stack

The retrieval memory you runemem
documents chunked, embedded, ranked by similarityone signed record per observation, at a content address
the top hit is close enoughthe address returns exactly one record, or a signed absence
you trust the retriever, the store, and whoever filled themthe receipt verifies offline; no trust in the sender or the server
memory scoped to one session, one product, one vendorone shared memory: any agent reads, any keyholder writes

It sits beside retrieval, not under it: emem does not hold your documents. It holds the measured state of the physical world, signed so that agents which share no infrastructure and no trust can still share the same facts.

When the token earns its keep

A long task survives its own context window. The harness compacts, the session ends, the model gets swapped. A paraphrase drifts; the token does not. After compaction it re-hydrates to the exact signed value, signature still checking. Record it once, cite it forever.

Two agents stop re-deriving each other's work. Agent A spends fifty tool calls establishing one fact and leaves the token in its report. Agent B, at another company, on another model, resolves it to the same bytes and proves it is genuine in one call. No shared database, no shared credentials, no "trust me".

A fleet shares one map it can prove. Robots and autonomous systems keep landmarks as emem:entity: identities and terrain or hazard readings as signed facts at addresses that never drift, shareable across vendors over the same MCP and REST surface agents use, verifiable without trusting the peer that wrote them. Runnable proof: examples/fleet-memory/, two vendors, one landmark, a 206-character handoff, verified offline.

Technical long-horizon tasks, the failure modes every agent and robot developer already knows:

Your problemWhat survives
Context compaction quietly turns your agent's verified details into paraphrasethe 84-char token outlives every summarization pass and re-hydrates to the exact signed bytes
A crash or restart lands mid-task and the transcript is gonenotes hold tokens, not payloads; the restarted agent resumes by resolving, not redoing
The model gets swapped or upgraded halfway through the projectthe address derives from the bytes, not from who asked; the successor resolves the same tokens identically
Subagents fan out and the join step drowns in payload copiesworkers receive and return tokens; the join resolves and verifies, contexts stay small
"Did I, or anyone, already compute this?" asked on every looprecall is ensure, not get: what exists is reused (was_cached), what is missing is fetched and signed once
"Is what I knew last week still valid?" with no cheap way to answer/v1/temporal_route scores per-band staleness: cite it or refetch it, no full re-read
A robot reboots, or a unit from another vendor joins the fleetlandmarks are emem:entity: identities at drift-free addresses; relocalize by resolving, merge maps by verifying

Long-horizon work, the same survival stretched from minutes to months:

TaskWhat the memory does
A watch that runs for months, across hundreds of sessionschange evidence accrues as signed facts; every alert cites the fact ids it fired on, and the relieving agent resumes from tokens, not from a predecessor's summary
A report that will be audited long after the agent that wrote it is goneevery claim in it is a token; an auditor, human or agent, resolves each one to the signed record and re-checks the signature without contacting the author
A project handed from one contractor's agents to another'severy prior finding stays citable across the handover; the successor resolves the same tokens to the same bytes instead of trusting the summary it was given
A decision that commits real resourcesthe state acted on is pinned at decision time (as_of_signed_at); "what did we know when we acted" has an exact answer months later, replayed without hindsight
A number that must hold across years of reportsrecords are immutable and supersession is explicit, so the baseline stays re-checkable by anyone, without trusting the author's laptop

Industry-specific versions of these, with the verticals named, live at emem.dev/solutions.

Memory outlives the context window: as the conversation is compacted turn after turn, payloads fall out of context, the one-line emem:fact token survives, and after compaction it re-hydrates from the shared memory to the exact signed bytes.

If you are an agent reading this, the runnable version is below, and https://emem.dev/llms.txt is the machine-readable entry point. The habit that matters most: before your context gets compacted or your turn ends, put the emem:fact: token for anything you verified into your notes or your final answer. You, your successor, or a different agent entirely can resolve and re-check it later.

See the memory

The memory is not an abstraction; you can walk through it. Each 3-D world at emem.dev/worlds draws one gaussian per cell of signed facts: height, tilt, thickness, and colour are each a measurement. Click any splat to read its values, copy its Memory Token, or re-check its signature at /verify. The dense worlds at emem.dev/splats push the same signed substrate to photoreal, with every splat labelled measured, interpolated, or synthesized, so the invented detail peels off and the signed trust root stays.

A rotating 3-D world of Interlaken built from signed facts: elevation, Sentinel-2 NDVI, and JRC water recurrence fused per cell, every splat carrying its own fact_cid.

Prefer a console? emem.dev has a live recall on the homepage, and emem.dev/humans is the whole corpus as an explorable constellation.

Use it in two minutes

Reading needs no key, no account, no signup.

MCP (Claude Code, Claude Desktop, Cursor, Cline; drop into .mcp.json):

{ "mcpServers": { "emem": { "type": "http", "url": "https://emem.dev/mcp" } } }

REST (any language):

CELL=$(curl -s -X POST https://emem.dev/v1/locate \
  -H 'content-type: application/json' -d '{"q":"Bengaluru"}' | jq -r .cell64)
curl -s -X POST https://emem.dev/v1/recall \
  -H 'content-type: application/json' \
  -d "{\"cell\":\"$CELL\",\"bands\":[\"weather.temperature_2m\"]}" | jq '.facts[0].value'

Python: pip install ememdev, then from ememdev import Client. Real as of 1.1.0, verified by installing into a clean environment and calling the live node; the wheel also ships the signing extra (pip install "ememdev[signing]") and an ememdev CLI for attested memory writes. Do not guess a shorter name: emem on PyPI is an unrelated project by another company. TypeScript: sdks/emem-ts/ publishes to npm as ememdev too; first publish pending, status in docs/roadmap.md.

Copy-paste configs for 12 clients, packaged Claude skills, TypeScript SDK
ClientSetup
Claude Desktopexamples/claude-desktop.json
Claude Codeexamples/claude-code.mcp.json
Cursorexamples/cursor.mcp.json
Cline (VS Code)examples/cline.mcp.json
Gemini CLIgemini extensions install https://emem.dev/gemini-extension.json
ChatGPT (Custom GPT)examples/openai-gpt-action.json
LangChain / LlamaIndex / Agno / AutoGen / CrewAI / Mastraexamples/<name>/
Any MCP client over the standard bridge{ "command": "npx", "args": ["-y", "mcp-remote", "https://emem.dev/mcp"] }

Packaged Claude skills live under claude-skills/; llms-install.md is a plain-text install guide an agent can follow by itself. TypeScript SDK: sdks/emem-ts/ (npm name ememdev; first publish pending).

If you are an agent

Reads need no key, and four moves cover most sessions.

Connect to https://emem.dev/mcp. It advertises the 14 tools of the loop, not the whole catalog. A host loads every descriptor it is handed, and all 94 cost about 210 KB of context whether or not the session ever touches Earth observation. Narrowing discovery removes nothing: tools/call dispatches all 94 by name at either endpoint, so a tool missing from your list is still callable. Use /mcp/full to have every tool registered up front.

Do not know which tool? Call emem_tools. With no arguments it returns the loop, a bundle menu, and a shape menu in about 6 KB. Ask by the shape of the answer you need, which is usually the real question, rather than by topic:

curl -s -X POST https://emem.dev/mcp -H 'content-type: application/json' \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/call",
       "params":{"name":"emem_tools","arguments":{"shape":"raster"}}}'

Every tool carries exactly one shape (scalar, timeseries, raster, geometry, vector, identity, token, proof, plan, file, catalog) and any number of overlapping bundles (tokenisation, verification, agent_to_agent, long_horizon, robotics, satellites, agriculture, forestry, climate_risk). {"bundle":"robotics"} returns just that bundle; {"name":"emem_ndvi"} returns one tool's input schema and a runnable example in about 2 KB; {"q":"ndvi"} searches the text.

Ground a place, then cite it. emem_locate maps a place to its cell64. emem_recall returns the signed facts there, and its receipt carries the fact_cid. emem_memory_token composes the two into one handle:

emem:fact:defi.zb5b3.mAmi.leco:nzyep244xoxx6uvw4ope5dghy3eniawczovvzrrp7almuydzdbta

Hand the token to another agent. They call emem_memory_token_resolve on that line, get the byte-identical signed fact back, and emem_verify_receipt checks the ed25519 signature without trusting you or the server. That is the whole claim, and it is the only one worth making: the same token resolves to the same bytes for anyone, and the receipt verifies on its own.

Writes are the one place a key appears, and it is still not an API key. Memory writes need an attester block signed by an ed25519 keypair you generate locally, with no registration step. A refused write answers with the exact digest to sign, the base32 encoding rules, and a worked example, so an agent gets from refusal to signed write in one turn without going to look for docs.

Build with it

OperationWhat it means for your agentTools
Recallread memory for a place; a miss fetches, signs, and stores for everyoneemem_recall, emem_locate, emem_recall_polygon
Citeone token per fact, or one emem:bundle: token for a setemem_memory_token, emem_memory_bundle
Verifytrust a fact without trusting the sender, offlineemem_verify_receipt, /verify
Weighevery fact says how it was produced; model and human classes carry an in-band caution; deterministic: true keeps only facts recomputable from raw sourceinside every recall
Time travelas_of_tslot for what was on the ground, as_of_signed_at for what the memory knewflags on every read
Self-checkdisagreement between writers is kept and scored, never averaged awayemem_memory_contradictions

Or skip the menu: emem_ask takes a plain-language question and returns a signed answer. Each agent also gets a private signed memory with the six standard file verbs, and any keyholder writes shared facts through POST /v1/attest. The full handbook is emem.dev/agents.md.

Why you can trust it

  1. A record's id is the blake3 hash of its canonical bytes: change one byte, the id changes, so the id proves the bytes.
  2. Every answer carries an ed25519 receipt that verifies offline against the responder's published key. No callback, no account.
  3. Every record names its source, its versioned algorithm, and its provenance class, so you know whether a value is recomputable from raw data or trusted through a model or a person.
  4. A missing value is a signed absence with a typed reason, never a bare 404.
  5. Nothing is overwritten. Later records supersede; disagreement between writers is kept and scored as evidence.
  6. An append-only transparency log (RFC 6962 construction, BLAKE3) with witness co-signing records every attestation batch. Pin a signed tree head from /v1/log/sth, then prove the log only grew since your pin. The receipt does not yet chain to the log; the whitepaper's honest limits say exactly what that does and does not prove.

The signature proves who attested a record and that the bytes never changed, not that the value is objectively true; confidence, uncertainty, and provenance travel with it. Deeper: how it works with live consoles, the formal model, the wire spec.

The world drifts too

Generating a plausible answer is cheap. The scarce thing is a shared account of the physical world that is measured, signed, and checkable by someone who was not there. Drift threatens that account from two directions. In language, the reference drifts: a paraphrase mutates while the world stands still, and the token pins it; that is everything above. In the world, the readout drifts: the reference stands still, the signal at it moves, and not every move is the world. Between two visits to one address, the observed change is a sum:

Δz = Δ_env + Δ_sensor + Δ_geo + Δ_encoder + ε

The world changed; the instrument changed; the pixels moved; the model changed; noise. Only the first term is about the world, and the substrate already pins the rest of the ledger. An embedding record carries its model checkpoint, so a model swap can never pose as change on the ground. Bitemporal recall keeps "the world changed" and "what the memory knew changed" as separate questions. Every change points at a specific immutable record by its id, and the receipt lets someone who was not there check the split. A first attribution ledger ships at /v1/change_attribution: per-term evidence with the fact ids it read, and no numeric split. The split itself is still roadmap work; the design and its honest gaps live in docs/roadmap.md.

Substrates: today and next

Today: satellite Earth observation. Open data from ESA, NASA, USGS, and the EU JRC fills the memory on demand: 124 wired measurements, drawn from a catalog of 46 declared source schemes of which several are declared but not yet fetchable (live lists at /v1/sources and /v1/bands), from elevation and NDVI to weather, forest change, and four open foundation-model embeddings.

Next: everything else that observes a location. Nothing in the record, receipt, or token grammar is satellite-specific; any observer with a location and a signing key can join the same attest, recall, cite, verify path. The multi-writer endpoint (POST /v1/attest) ships today; written substrate profiles for CCTV and fixed sensors, drones, robot fleets, industrial machines, government registries, and open data programs are roadmap work, tracked with the rest in docs/roadmap.md. Location stays the first key for all of them.

Run your own node

The hosted node runs the exact binary in this repo, and both name the planet the same way, so a receipt minted on one verifies on the other:

docker run -p 5051:5051 ghcr.io/vortx-ai/emem:latest   # or: cargo run --release --bin emem-server

One note worth reading twice: the signing key is your node's identity. Mount a volume for EMEM_DATA (or set EMEM_SECRET_B32) before you hand out receipts you care about. Full guide: docs/self-host.md.

Measured on the production node (methods in docs/benchmarks.md): warm recall p50 2.5 ms, offline verification p50 0.13 ms, 632 requests/s on one node, cold materialize 0.5 to 1.6 s depending on the upstream.

Honest limits

Version 1.1.0, under the stability promise 1.0.0 made: the wire format, receipt preimage, and address space are settled and will not break under a 1.x. Today it is a single-host deployment (no federation yet), the memory holds thousands of places rather than billions, and it grounds facts about physical places, not arbitrary text. Verification is per-responder: a receipt proves what this responder signed, never a network consensus. The change attribution described above ships as an evidence ledger; the numeric split of a delta among its terms is still roadmap. The complete edge list, the staged path to federation, and the open research live in docs/roadmap.md.

Learn more

WhatWhere
How it works, with live consoleshttps://emem.dev/how-it-works
The whitepaper, canonicaldocs/whitepaper.md
The formal memory model and algebradocs/model.md
Agent integration handbookhttps://emem.dev/agents.md
Ten minutes to a verified, shareable factdocs/tutorials/first-verified-memory.md
Limits, roadmap, open researchdocs/roadmap.md
Benchmarks, with methodsdocs/benchmarks.md
Industry use caseshttps://emem.dev/solutions
Wire spec · OpenAPI (118 paths) · MCP (94 tools)https://emem.dev/spec.md · /openapi.json · /mcp
Live proof in a regulated workflowhttps://eudr.dev
Companion open modelTerraGround-Gemma

Research and citation

emem: A research on Content-Addressed, Verifiable Earth-Memory Protocol for AI Agents over Foundation-Model Embeddings. Jaya Kumari, Avijeet Singh. Vortx AI, 2026. Open preprint (Zenodo, CC-BY-4.0; not yet peer-reviewed). doi.org/10.5281/zenodo.20706893

@misc{emem2026,
  title  = {emem: A research on Content-Addressed, Verifiable Earth-Memory
            Protocol for AI Agents over Foundation-Model Embeddings},
  author = {Kumari, Jaya and Singh, Avijeet},
  year   = {2026},
  doi    = {10.5281/zenodo.20706893},
  publisher = {Zenodo}
}

Contributing and license

Issues and pull requests welcome: CONTRIBUTING.md, SECURITY.md. Pure Rust, Apache-2.0 (LICENSE, NOTICE); default-build data sources are open, with no API keys and no lock-in. Built by vortx.ai. A shared memory is worth more the more agents read and write it; if yours use emem, a star helps other builders find it.

Featured
CodeRabbit
CodeRabbit
AI writes the code. CodeRabbit catches the slop.
Try For Free →
AppSignal
AppSignal
Monitor with ease. Code with confidence.
Start Free Trial →
AI notepad for back-to-back meetings
AI notepad for back-to-back meetings
Notes, actions and memory. Without a meeting bot. First month 100% off.
Download for free →
Keep your Mac awake
Keep your Mac awake
Keep your Mac awake while Claude Code and 40+ AI agents run. Sleeps when they're idle.
One time payment $9 →
Email for Agents: Free tier availableEmail for Agents: Free tier available
Email for Agents: Free tier available
Give your AI agent a complete email layer—sending, inbound inboxes, and sandbox testing.
Get 4K emails/month free →
Context.devContext.dev
Context.dev
Integrate web data into your AI product. One API to scrape website & brand data.
Get API Key Now →
CodeScene MCP ServerCodeScene MCP Server
CodeScene MCP Server
Your agent targets a perfect 10 Code Health score. Deterministic. Every commit.
Try For Free →
Make your agent a DeFi expert
Make your agent a DeFi expert
Agent, run crypto. Access onchain data & trade routes via 1inch.
Install now →

Configuration

EMEM_BIND

Bind address for the HTTP server. Defaults to 0.0.0.0:5051 inside the container.

EMEM_DATA

Path to the persistent data directory (sled cache + ed25519 identity). Mount a volume here.

EMEM_PUBLIC_URL

Optional canonical origin for self-referencing URLs in MCP responses (e.g. https://emem.dev). When unset the server falls back to urn:emem.

EMEM_TLS_DOMAINS

Comma-separated hostnames for built-in Let's Encrypt ACME (TLS-ALPN-01). When set, the server binds 0.0.0.0:443 instead of EMEM_BIND.

Categories
AI & LLM Tools
Registryactive
Packageghcr.io/vortx-ai/emem:latest
TransportHTTP
Resources18
Prompts8
Tools verifiedJun 10, 2026
UpdatedMay 30, 2026
View on GitHub

Related AI & LLM Tools MCP Servers

View all →
SkillFM LLM Cost Optimizer

io.github.ericm1018/skillfm-llm-cost-optimizer-openai-anthropic-usage

LLM cost optimizer for OpenAI, Anthropic, token usage, BYOK, and SkillFM Beacon audits.
Llm Orchestration Agent

io.github.mikerawsonnz/llm-orchestration-agent

Run a prompt through a LangChain (system + human) chain over Gemini on Vertex AI; optional LangSmith
Authenticated Llm Agent

io.github.mikerawsonnz/authenticated-llm-agent

JWT-gated LLM gateway: authenticate (bcrypt/JWT), then run a LangChain-on-Vertex Gemini completion.
Copilot Memory MCP

labforgedev/copilot-memory-mcp

Persistent semantic memory for AI agents using local ChromaDB vector search. No cloud required.
1
Agent Prompt Injection Firewall Mcp

csoai-org/agent-prompt-injection-firewall-mcp

The WAF for agents. Pattern-based + heuristic firewall scans prompts, RAG documents, tool argume...
Authenticated Multi Llm Agent

io.github.mikerawsonnz/authenticated-multi-llm-agent

Google-OAuth-gated LLM gateway: verify a Google ID token, then run a Gemini (Vertex AI) completion f