emem
emem — протокол памяти Земли для ИИ-агентов
Цитируемая, контентно-адресуемая, подписанная память о каждом месте на Земле. 1 протокол. 8 примитивов чтения. Квитанции ed25519. Никаких ключей для L0/L1. Apache-2.0. Только чистый Rust + открытые данные.
GET /health POST /v1/recall POST /v1/find_similar
GET /v1/agent_card POST /v1/compare POST /v1/diff
GET /openapi.json POST /v1/query_region POST /v1/trajectory
GET /.well-known/emem.json POST /v1/verify POST /v1/intent
GET /v1/demos POST /v1/attest POST /mcp
POST /v1/verify_receipt GET /v1/facts/:cidЧто это такое
emem — это протокол, а не сервис, для контентно-адресуемой памяти Земли.
Каждый факт о каждом месте получает стабильный CID, производный от канонического CBOR
его полезной нагрузки (cell × band × tslot). Каждое чтение — это подписанная квитанция, которую
любой клиент может проверить офлайн с помощью открытого ключа ed25519 отвечающей стороны.
emem создан для ИИ-агентов: когда пользователь упоминает место, агент
должен вызвать emem и сослаться на receipt.fact_cids[0]. Протокол одинаково хорошо работает
через обычный REST, MCP JSON-RPC 2.0 и пользовательские действия OpenAPI 3.1.
Зачем это нужно агентам
LLM выдумывают пространственные факты. Без проверяемого, контентно-адресуемого уровня памяти любой ответ на вопрос «что находится в месте X?» невозможно проверить. emem исправляет это:
присваивая каждому пространственному факту cid, который обе стороны пересчитывают побайтово,
подписывая каждое чтение с помощью ed25519, включая открытый ключ отвечающей стороны, чтобы квитанцию можно было проверить офлайн,
покрывая всю Землю квадратным адресом cell64 (~10 м × ~10 м на экваторе, широта 21 бит × долгота 22 бита — соответствует собственному шагу Sentinel-1/-2). Биграммный алфавит кодека упорядочен по Гильберту, поэтому соседние ячейки получают визуально похожие строки, но геометрия представляет собой квадратную сетку.
Быстрый старт
Вариант A — Docker (инструментарий Rust не требуется)
docker run --rm -p 5051:5051 -v emem-data:/var/emem \
ghcr.io/vortx-ai/emem:latest
curl -s http://localhost:5051/healthВариант B — HuggingFace Space
Размещенный экземпляр находится по адресу
huggingface.co/spaces/vortx-ai/emem.
Обращайтесь к ${SPACE_URL}/mcp из любого MCP-клиента, чтобы взаимодействовать с ним.
Вариант C — Сборка из исходного кода
# 1) Build the workspace.
cargo build --release --workspace
# 2) Run the server (defaults: 0.0.0.0:5051, persistent storage at ./var/emem).
EMEM_BIND=0.0.0.0:5051 EMEM_DATA=./var/emem ./target/release/emem-server
# 3) Hit it.
curl -s http://localhost:5051/health
curl -s -X POST http://localhost:5051/v1/recall \
-H 'content-type: application/json' \
-d '{"cell":"damO.zb000.xUti.zde78"}' # Mt FujiMCP / Claude Desktop / Cursor / Cline
Готовые к вставке конфигурации находятся в examples/:
платформа | файл |
Claude Desktop |
|
Claude Code |
|
Cursor |
|
Cline (VS Code) |
|
OpenAI GPT |
|
LangChain |
|
LlamaIndex |
|
Полное руководство по интеграции агентов находится в docs/AGENTS.md.
Живые сквозные демонстрации
Два CLI-бинарных файла выполняют полный протокол против запущенного сервера и
записывают файлы запроса + ответа + квитанции для каждого шага в var/demos/<UTC>/:
./target/release/emem-livedemo # synthetic data, every primitive
./target/release/emem-realdemo # real Copernicus DEM 30m S3 tilesСервер предоставляет артефакты трассировки по адресу GET /v1/demos.
Как это работает
┌──────────────┐ ┌────────────────────┐
user ──────► │ AI agent │ ──────► /v1/ │ emem responder │
│ (Claude / │ /mcp │ ┌──────────────┐ │
│ Cursor / │ /openapi.json │ │ ed25519 key │ │
│ GPT / etc) │ │ └──────────────┘ │
└──────┬───────┘ │ ┌──────────────┐ │
│ │ │ sled cache │ │
│ signed receipt │ └──────────────┘ │
▼ │ ┌──────────────┐ │
┌──────────────┐ │ │ merkle log │ │
│ user reply │ │ └──────────────┘ │
│ + cid │ │ ┌──────────────┐ │
└──────────────┘ │ │ vsicurl COG │ ──► open data
│ └──────────────┘ │ (Cop-DEM, JRC,
└────────────────────┘ Hansen, ESA…)Алгебра адресов (стоимость токенов)
поле | биты | формат передачи | токены |
| 64 | 4 BPE биграммы | ≤ 4 |
| 64 | base32 short | ≤ 2 |
| 1792 D fp16 | 12-байтовый префикс | ≤ 3 |
| 32 B | 8-байтовый префикс | ≤ 3 |
Криптография: хеширование blake3, подписи ed25519, CIDs в формате base32-nopad-lowercase.
Квитанции подписываются через blake3(request_id || served_at || primitive ||
cells || fact_cids), поэтому любой клиент проверяет их офлайн с помощью открытого ключа отвечающей стороны
в /.well-known/emem.json.
Полная математика + архитектура в docs/WHITEPAPER.md. Спецификация формата передачи в docs/SPEC.md.
Открытый исходный код, открытые данные
emem поставляется только с зависимостями с открытым исходным кодом и считывает данные только от провайдеров открытых данных в своей сборке по умолчанию. Никаких API-ключей, никаких учетных данных оператора, никакой привязки к SaaS.
вопрос | как это обрабатывается |
лицензия кода | Apache-2.0 (этот репозиторий) |
лицензии библиотек | Все зависимости MIT / Apache-2.0 / BSD / ISC — см. NOTICE |
лицензии данных | Copernicus DEM (открытые), JRC GSW (CC-BY 4.0), Hansen GFC (открытые), ESA WorldCover (CC-BY 4.0), GHSL / WorldPop (CC-BY 4.0), OSM (ODbL) — см. NOTICE |
аутентификация | отсутствует для чтений L0/L1; ключ аттестатора ed25519 для записей L2 |
транспорт | HTTPS через встроенный rustls + Let's Encrypt ACME (без Cloudflare, без прокси) |
Структура рабочего пространства
emem/
├── Cargo.toml # workspace root
├── crates/
│ ├── emem-core/ # types, manifests, errors
│ ├── emem-codec/ # cell64, cid64, vec64, hilbert
│ ├── emem-fact/ # canonical CBOR + facts + receipts
│ ├── emem-claim/ # structured claims, verify outcomes
│ ├── emem-cache/ # sled hot cache (cell64 → cid64 → fact)
│ ├── emem-fetch/ # vsicurl Range reads, source connectors
│ ├── emem-storage/ # Storage trait, append-only merkle log
│ ├── emem-cubes/ # 1792-D voxel cube loader (legacy AgriSynth bootstrap)
│ ├── emem-primitives/ # recall, compare, find_similar, …
│ ├── emem-attest/ # merkle root, batch verify
│ ├── emem-intent/ # intent → plan
│ ├── emem-mcp/ # MCP tool surface
│ ├── emem-api-rest/ # axum router + OpenAPI + content nego
│ └── emem-cli/ # emem-server, emem-livedemo, emem-realdemo
├── docs/ # SPEC, WHITEPAPER, AGENTS, DEPLOY
├── examples/ # paste-ready MCP configs
└── web/ # landing surface (HTML, JSON, llms.txt)Развертывание
Для полноценного многоканального развертывания (GitHub public, GHCR, зеркало Docker Hub, HuggingFace Space, реестр MCP-серверов, PR в awesome-mcp-servers), следуйте docs/GO_LIVE.md.
См. docs/DEPLOY.md для получения полной информации о развертывании для
самостоятельно размещенного экземпляра в стиле emem.dev.
Кратко для emem.dev:
EMEM_TLS_DOMAINS=emem.dev,www.emem.dev EMEM_TLS_CONTACT=mailto:avijeet@vortx.ai ./target/release/emem-serverоткройте
:443в вашем списке облачной безопасности,setcap 'cap_net_bind_service=+ep' ./target/release/emem-server,укажите A-запись
emem.devна публичный IP хоста — готово.
Сервер выполняет собственное TLS + Let's Encrypt ACME через rustls-acme /
TLS-ALPN-01 (требуется только :443; без :80, без Cloudflare, без Caddy).
Участие в разработке
Проблемы и PR приветствуются — см. CONTRIBUTING.md для цикла разработки, CODE_OF_CONDUCT.md и SECURITY.md для раскрытия уязвимостей.
Лицензия
This server cannot be installed
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Latest Blog Posts
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/Vortx-AI/emem'
If you have feedback or need assistance with the MCP directory API, please join our Discord server