Skip to main content

emem-langmem

LangChain BaseStore backed by emem.dev — drop-in agent memory for LangGraph with ed25519 receipts and content-addressed recall.

Install

pip install emem-langmem

Use

from emem_langmem import EmemStore
from langgraph.graph import StateGraph

store = EmemStore(base_url="https://emem.dev", signing_key=SEED)

graph = StateGraph(...).compile(store=store)

SEED is a raw 32-byte ed25519 seed that you own and persist, for example os.urandom(32) once, then kept wherever the agent's other secrets live. It signs every write, and the responder requires that: an unattested write is refused unless the operator opened the responder with EMEM_MEMORY_OPEN=1. The key also decides where the store writes.

EmemStore implements the four BaseStore verbs by issuing MCP tools/call requests to the emem responder against the six Anthropic memory-tool verbs:

BaseStore verb emem MCP tool Signed
mget(keys) emem_memory_view read, no signature
mset(pairs) emem_memory_create yes
mdelete(ks) emem_memory_delete yes
yield_keys emem_memory_view (directory walk) read, no signature

Namespaces

With a signing key, the store roots itself at /memories/by_attester/<pubkey8>/, where <pubkey8> is the first 8 characters of your base32 pubkey. Only that key can write there, so agents sharing one responder cannot overwrite each other. LangChain calls mget(("ns","key")) and the store reads /memories/by_attester/<pubkey8>/ns/key.

store.root              # '/memories/by_attester/aoqqpp7t'
store.signer.pubkey_b32 # the full base32 pubkey

A key that starts with / is taken as a literal absolute path and is left alone, which is how you reach outside your own root. Writing into another key's namespace is refused with a 403. Without a signing key the root stays /memories and writes go out unattested. See docs/memory.html for the wire format.

EmemSigner is public if you drive the memory tools yourself and need the same attester block:

from emem_langmem import EmemSigner

signer = EmemSigner(SEED)
signer.attester_block("create", f"{signer.namespace_root}/n.md", b"hi")
# {'pubkey_b32': '...', 'sig_b32': '...'}

Async variants amget / amset / amdelete / ayield_keys are implemented over httpx.AsyncClient.

Self-host

EmemStore(base_url="http://127.0.0.1:5051")

or set EMEM_BASE_URL in the environment.

Receipts

Every read and write returns an ed25519 receipt from the emem responder. The receipt is currently dropped at the BaseStore interface boundary (LangChain's contract has no receipt slot). To inspect receipts, call the underlying MCP tool directly:

import json, httpx, uuid
r = httpx.post(
    "https://emem.dev/mcp",
    json={
        "jsonrpc": "2.0",
        "id": str(uuid.uuid4()),
        "method": "tools/call",
        "params": {
            "name": "emem_memory_view",
            "arguments": {"path": "/memories/my/note.txt"},
        },
    },
).json()
print(r["result"]["structuredContent"]["receipt"])

License

Apache-2.0.

Metadata

Release files for emem-langmem 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 emem-langmem 2.4.2
File Size Uploaded
emem_langmem-2.4.2.tar.gz 18.2 kB Details

Built distribution (wheel)

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

Total release size: 31.9 kB

Release files / emem_langmem-2.4.2.tar.gz

Download URL emem_langmem-2.4.2.tar.gz
Size 18.2 kB
Tags Source
SHA-256 checksum
How to use checksums
57985c1f3833927d034064510da54dc3329c14837d15515379d6fe4d23d4c9a7
BLAKE2b-256 checksum
How to use checksums
dc8694957aec3bbca0fa72c4629b20527cc274131ec5b042e94a9156803b09c2
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 / emem_langmem-2.4.2-py3-none-any.whl

Download URL emem_langmem-2.4.2-py3-none-any.whl
Size 13.7 kB
Tags Python 3
SHA-256 checksum
How to use checksums
95efcf48d6230450a8d4fde01424e620496d4f1ba9d7ab3f9ba7e7ad992eb59f
BLAKE2b-256 checksum
How to use checksums
a9a7b12f1be584c7e49b933052f8f82a7d92f3fe1cb6ae5352f76decebfd8746
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

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