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.0

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.0
File Size Uploaded
emem_langmem-2.4.0.tar.gz 17.0 kB Details

Built distribution (wheel)

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

Total release size: 29.9 kB

Release files / emem_langmem-2.4.0.tar.gz

Download URL emem_langmem-2.4.0.tar.gz
Size 17.0 kB
Tags Source
SHA-256 checksum
How to use checksums
88db25f72e04e2f7e5cb253843128a76f2771e9c55c53d243b468645d470de8a
BLAKE2b-256 checksum
How to use checksums
e795441ee38c82de72b4de9bb03479afc80d019d041a03d673591072174aebf4
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 9, 2026.

Transparency log

Release files / emem_langmem-2.4.0-py3-none-any.whl

Download URL emem_langmem-2.4.0-py3-none-any.whl
Size 12.8 kB
Tags Python 3
SHA-256 checksum
How to use checksums
3728e3c07e067d9d762f487fb1f983ba2551ab6b1def7557e15a0271a0e92dd9
BLAKE2b-256 checksum
How to use checksums
db7b27dca747a5695f48822551e902c565829e571202d271f0069f8cbb554bf8
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 9, 2026.

Transparency log

Release history Release notifications | RSS feed

2.4.2

2 release files

This release

2.4.0 This release

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