Skip to main content

Make your agent cite, not invent.

An agent in production will answer a question about a place it never observed, fluently and wrong. geo.qa hands it a memory it can recall before it answers: signed facts at a cell address, returned over the same MCP tools the open emem protocol already speaks, each one carrying an ed25519 receipt your agent can verify on its own.

recall  cite  verify
3 native + 81 emem tools
receipt · ed25519 · offline
Plate i · the cell an agent recallssurvey · 1:∞
Fig. i. Your agent names a place, gets back its stable cell address, and reads every dated observation filed against it, public and private, in one call.

Chapter I

The same question, two memories.

On-call already paged about the south yard at 03:14:09. The model has no idea, so it writes something that reads true. Watch what changes when it can recall.

# without geo.qa: the model fills the gap user anything wrong at the south yard in the last 2 hours? agent Nothing unusual at the south yard. Overnight readings look nominal and no events are on record. You're clear to proceed. # plausible paragraph. invented. no place was read. # on-call already paged this site at 03:14:09.
Spec. 1. Fluency without a memory. The agent has no place to read, so it reaches for the most likely sentence and serves it as fact.
# with geo.qa: the agent recalls first tool recall("south yard", window="PT2H") agent Three sensors that never talked filed here: · a SAR pass at 02:51 flagged a new return · the gate camera logged a truck at 03:02 · the line gauge read pressure dropping 03:09 Same cell, inside two hours. Worth a look. cell 8a2a1072bffffff · 3 modalities · PT2H receipt 0x9af2…be21 · signed
Spec. 2. Plain language, three independent sources, one address. No confidence theatre. Just what each sensor saw, and a receipt to check it.

Both agents are fluent. Only one is grounded. The left one had nothing observed to read, so it produced the answer that sounded most likely given everything it had ever seen on the internet. That answer is not a lie, exactly. It is the shape of an answer with no fact inside it.

The right one called recall before it spoke. It resolved south yard to a stable cell, read the last two hours of facts filed against it, and found three witnesses that had never talked to each other: a Sentinel-1 SAR pass, the gate camera, a pressure gauge on the line, all landing on one address inside one window. It did not invent agreement. It reported it.

Notice what the grounded answer does not do. It does not quote a sigma, a confidence band, or a probability. It says what each sensor saw, in order, and attaches the receipt. An operator can act on that, and an auditor can replay it weeks later against the exact observations it used.

Chapter II

The tools your agent already speaks.

Your agent gets two MCP surfaces: geo.qa’s own vision tools at geo.qa/api/mcp, and the open emem.dev protocol for Earth observation — ~81 tools, each read carrying a readOnlyHint so an agent can call it freely. These emem tools are the ones it reaches for most, and each name is the one it calls on the wire.

ToolWhat it doesReturns
locate & ask
emem_locateA place name or lat/lon resolves to its one stable cell address.cell
emem_askFree-text geographic Q&A. has this parcel flooded this month? routes to the right bands and returns a cited fact.fact + receipt
emem_recallEvery signed fact filed at a place, over a time window, across all sensors that wrote there.facts[]
emem_recall_polygonThe same recall, but for a whole region drawn as a polygon, in one call.facts[]
emem_find_similark-nearest-neighbour search over embeddings: find me places that look like this one.cells[]
prove it
emem_verifyHand it a claim, say this field was deforested in May, and it evaluates that against the observed record.verdict + facts
emem_verify_receiptCheck an ed25519 signature offline, against the public key. No callback to geo.qa, no trust in the agent that produced it.valid · invalid
domain shortcuts
emem_ndvi · emem_lstVegetation index and land-surface temperature at a place, without the agent knowing which source or band to call.fact
emem_water · emem_forestSurface water and forest-loss readings, from JRC water and Hansen GFC, resolved to the cell.fact
emem_air · emem_weatherAir quality (CAMS) and weather fields (ERA5, Met.no) at a place and time.fact
physics solvers
emem_heat_solveRun a heat-diffusion solve over the cells around a place.field
emem_wave_solveRun a wave-propagation solve over a neighbourhood.field
emem_jepa_predictProject the next latent state of a place forward. The shared prediction head is early, so for production forecasting you bring or train your own on your memory.latent

Each tool maps to a plain verb an agent already understands: locate, ask, recall, watch, verify. Public memory on emem.dev answers the same way private memory in your tenancy does, so an agent can cite both in a single response.

Chapter III

Connect it in one config.

Point Claude Desktop, Cursor, or any MCP client at geo.qa/api/mcp for the vision tools, and at the open emem.dev protocol for Earth observation. Drop this into your mcpServers block and your agent can detect, cite, and verify on the next turn.

~/.config · mcpServers
{
  "mcpServers": {
    "geoqa": {
      "transport": "streamable-http",
      "url": "https://geo.qa/api/mcp",
      "headers": { "X-API-Key": "on_…" }
    },
    "emem": {
      "transport": "streamable-http",
      "url": "https://emem.dev/mcp"       // open EO protocol, ~81 tools
    }
  }
}
geo.qa/api/mcpgeo.qa’s native MCP: detect_objects, classify_land_cover, analyze_scene.
X-API-Key: on_…a public-scope key from your account; detect_objects works even without one
emem.dev/mcpthe open EO protocol, wired as a second server so answers can cite public memory too
transport: streamable-httpworks in Claude Desktop, Cursor, and any MCP-aware host.
tools/listPOST it to either endpoint to see the live tool schema on connect
airgapped varianton Enterprise, point it at a tenancy inside your boundary: no calls home

That is the whole integration. There is no SDK to vendor and no schema to learn; the tools describe themselves to the agent. Restart the client, ask a question about a real place, and the model will reach for emem_recall before it answers.

Chapter IV

One receipt, passed hand to hand.

A receipt is not a log line. It is a portable trust token: an ed25519 signature over canonical CBOR, hashed with BLAKE3. Anyone downstream can check it offline, even if geo.qa is unreachable, even if they do not trust the agent that produced it.

# the same receipt, three holders, no re-query Claude (tenant acme) recalls the south yard, answers, and attaches ◇ receipt 0x9af2…be21 │ ▼ agent (tenant insurer) receives the claim, calls emem_verify_receipt(0x9af2…be21) → valid │ ▼ human auditor checks the signature against the public key at /.well-known/emem.jsonvalid # geo.qa was offline for the last two checks. # the signature still held.
Spec. 3. The receipt travels with the claim. Each holder verifies it without asking us, and without trusting the one before them.
claimsouth yard · 3 witnesses agree
cell8a2a1072bffffff
windowPT2H · ending 03:14:09
sourcessatellite · camera · gauge
hashBLAKE3 · canonical CBOR
siged25519 · 64 bytes
receipt 0x9af2…be21 · verifiable offline
portableIt moves with the answer. Forward the receipt and you forward the proof. No shared session, no callback.
offlineIt checks without us. The public key lives at /.well-known/emem.json. Verification needs the receipt and the key, nothing else.
trustlessIt survives a hostile holder. An auditor who trusts neither agent can still confirm the facts were observed and signed.

Give your agent a memory.

Wire the tools in one config, and the next time it is asked about a real place it will recall, cite, and hand over a receipt anyone can check.

geo.qa · a vortx ground decoder · emem.dev open protocol