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.
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.
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.
| Tool | What it does | Returns |
|---|---|---|
| locate & ask | ||
| emem_locate | A place name or lat/lon resolves to its one stable cell address. | cell |
| emem_ask | Free-text geographic Q&A. “has this parcel flooded this month?” routes to the right bands and returns a cited fact. | fact + receipt |
| emem_recall | Every signed fact filed at a place, over a time window, across all sensors that wrote there. | facts[] |
| emem_recall_polygon | The same recall, but for a whole region drawn as a polygon, in one call. | facts[] |
| emem_find_similar | k-nearest-neighbour search over embeddings: “find me places that look like this one.” | cells[] |
| prove it | ||
| emem_verify | Hand it a claim, say “this field was deforested in May,” and it evaluates that against the observed record. | verdict + facts |
| emem_verify_receipt | Check 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_lst | Vegetation index and land-surface temperature at a place, without the agent knowing which source or band to call. | fact |
| emem_water · emem_forest | Surface water and forest-loss readings, from JRC water and Hansen GFC, resolved to the cell. | fact |
| emem_air · emem_weather | Air quality (CAMS) and weather fields (ERA5, Met.no) at a place and time. | fact |
| physics solvers | ||
| emem_heat_solve | Run a heat-diffusion solve over the cells around a place. | field |
| emem_wave_solve | Run a wave-propagation solve over a neighbourhood. | field |
| emem_jepa_predict | Project 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.
{
"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
}
}
}
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.
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