Skip to main content

ememdev: Python client for emem.dev

Thin, typed Python client for the emem.dev Earth memory protocol. Wraps the public REST surface in a single Client class that returns parsed JSON verbatim. Every ed25519-signed receipt and content-addressed CID is preserved for citation and offline verification. The current surface is whatever /openapi.json lists; this README does not restate a count that would go stale.

Install

pip install ememdev

The distribution and the import package are both named ememdev (so pip install ememdev, then from ememdev import Client); the shorter name emem on PyPI belongs to an unrelated project. To work from a checkout instead:

pip install -e sdks/emem-py

Requires Python 3.9+. The only runtime dependency is httpx. To sign memory writes (below), add the signing extra, which pulls blake3 and cryptography:

pip install "ememdev[signing]"

Quick start

from ememdev import Client

with Client() as em:
    cell = em.locate("Mount Fuji")["cell64"]
    facts = em.recall(cell, bands=["copdem30m.elevation_mean"])
    print(facts["facts"][0]["value"])

Async

import asyncio
from ememdev import AsyncClient

async def main() -> None:
    async with AsyncClient() as em:
        out = await em.ask("How tall is Mount Everest?")
        print(out["answer"])

asyncio.run(main())

Configuration

Env var Default Effect
EMEM_BASE_URL https://emem.dev Responder root; point at a self-hosted node
EMEM_TIMEOUT_SECS 180 HTTP timeout (matches gateway timeout)

You can also pass base_url= and timeout= directly to the constructor.

Surface coverage

Geocoder + read primitives, physics solvers, boring lat/lng shortcuts, and introspection — see the inline docstring on emem.client for the full endpoint → method mapping.

Writing a signed note

Reads are anonymous. Writes into the agent memory namespace are gated by an ed25519 attester block, and that signature is the one thing the MCP client cannot produce for you. ememdev[signing] produces it, from a persistent identity, so leaving a signed note is one command rather than a hand-rolled crypto script.

The identity is resolved once and reused every session, because the key is what owns your namespace at /memories/by_attester/<pubkey8>/.... Resolution order: EMEM_AGENT_KEY (a 64-char hex seed or a key-file path), then ~/.emem/agent_ed25519.pem (override the directory with EMEM_HOME), minted 0600 on first use if absent.

From the command line, for an agent that already speaks to emem over MCP:

ememdev whoami          # your pubkey and namespace_root

# emit just the attester block, sign nothing else (no network):
ememdev sign  --verb create --path /memories/by_attester/<you>/note.md --stdin < note.md

# or sign a create and POST it to /mcp in one step:
ememdev write --path /memories/by_attester/<you>/note.md --body-file note.md

Or in Python:

from ememdev import load_or_create_signer

signer = load_or_create_signer()             # persistent identity
path = f"{signer.namespace_root}/note.md"
body = b"a durable, signed, citeable note"
attester = signer.attester_block("create", path, body)
# POST {path, file_text, kind, attester} to /mcp emem_memory_create.

str_replace and insert sign the whole file after the edit, and rename binds both ends of the move (signer.rename_attester_block(old, new)); see the ememdev.signing docstring for the per-verb body rule. A write into another key's namespace is refused with a 403, and sign/write refuse it locally first.

Receipts

Every non-introspection response carries a receipt block with:

  • responder_pubkey_b32 (ed25519 base32-nopad-lowercase)
  • signature_b32 (ed25519 over the BLAKE3 preimage digest)
  • preimage_version (which rule signed it; read it, do not assume)
  • merkle_proof (inclusion proof for fact_cids[0], when one was recorded)
  • fact_cids[] (the BLAKE3 CIDs of every fact returned)

To cite an answer: quote receipt.fact_cids[0] and the responder pubkey. The signature can be verified offline against the public key at https://emem.dev/.well-known/emem.json; no callback to the responder is required.

Pass the receipt on whole. ememdev returns it verbatim and you should store and forward it the same way. From preimage_version: 2 the signature covers the inclusion proof as well as every other field it binds, which is what stops an intermediary stripping the proof in transit. The cost is that a receipt is byte-for-byte or nothing: drop merkle_proof because it looks redundant, re-key a field, or summarise the envelope, and it comes back signature_valid: false on data nobody tampered with — indistinguishable from forgery. POST /v1/verify_receipt reports reason: receipt_reshaped_after_signing instead of signature_invalid when the responder can prove that is what happened, but it never accepts the receipt.

License

Apache-2.0. Same as the upstream protocol.

Metadata

Release files for ememdev 2.4.2

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for ememdev 2.4.2
File Size Uploaded
ememdev-2.4.2.tar.gz 29.7 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for ememdev 2.4.2
File Interpreter ABI Platform
ememdev-2.4.2-py3-none-any.whl Python 3 none any Details

Total release size: 61.2 kB

Release files / ememdev-2.4.2.tar.gz

Download URL ememdev-2.4.2.tar.gz
Size 29.7 kB
Tags Source
SHA-256 checksum
How to use checksums
9252e8ba80f9f14f71c7a19fbb9f1b3612245375868eab8a2d1ddbd1900029ac
BLAKE2b-256 checksum
How to use checksums
622d319f1442eb14e83e0856f4dd250aeff11d04e98e16109b75f1f8a907099b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 29, 2026.

Transparency log

Release files / ememdev-2.4.2-py3-none-any.whl

Download URL ememdev-2.4.2-py3-none-any.whl
Size 31.5 kB
Tags Python 3
SHA-256 checksum
How to use checksums
9da9767fd92f6af7c571bc8e74075ee9e743e0cb769fcf37135ba89514a3b089
BLAKE2b-256 checksum
How to use checksums
9ae948f229363fd2e36e97a7b472f04554f89593bb4f2f3f3bb3fdfe9f291c37
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 29, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

2.4.2 This release

2 release files

2.4.0

2 release files

2.3.0

2 release files

2.2.0

2 release files

2.1.0

2 release files

2.0.0

2 release files

1.4.0

2 release files

1.3.0

2 release files

1.2.1

2 release files

1.2.0

2 release files

1.1.0

2 release files

1.0.0

2 release files

0.1.0

2 release files

0.0.9

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page