Skip to main content

Scoped memory for LLM agents. Install and go.

Project description

 ███╗   ███╗███████╗███╗   ███╗██████╗ ██╗   ██╗███████╗
 ████╗ ████║██╔════╝████╗ ████║██╔══██╗██║   ██║██╔════╝
 ██╔████╔██║█████╗  ██╔████╔██║██████╔╝██║   ██║███████╗
 ██║╚██╔╝██║██╔══╝  ██║╚██╔╝██║██╔══██╗██║   ██║╚════██║
 ██║ ╚═╝ ██║███████╗██║ ╚═╝ ██║██████╔╝╚██████╔╝███████║
 ╚═╝     ╚═╝╚══════╝╚═╝     ╚═╝╚═════╝  ╚═════╝ ╚══════╝

Scoped memory for LLM agents. Install and go.

PyPI version Python License: MIT MCP Native


Most agent frameworks treat memory as an afterthought — a global dict, a hacked-together file, or nothing at all. MemBus fixes that.

It gives your agents a clean, scoped memory layer backed by a real server — so memories survive restarts, agents can share context, and you can swap the storage backend without touching a line of agent code.


Install

pip install membus

After installing, type membus in your terminal to open the interactive quick-start guide.


How it works

MemBus has two parts:

Part What it does Where it runs
membus-server Stores memories, handles scopes, auth, and adapters Your server (Render, Railway, self-hosted)
membus (this package) Python client — read, write, manage memories Your agent code

The client talks to the server over HTTP. Swap the server's adapter in one env var — no client code changes ever.


Quick Start

from membus import MemBus, Scope

bus = MemBus()  # uses your deployed server by default

# Store something
bus.write("user_name", "Alice", scope=Scope.USER, scope_id="user_123")

# Get it back — anywhere, any agent
name = bus.read("user_name", scope=Scope.USER, scope_id="user_123")
# → "Alice"

# Clean up a session when it ends
bus.manage(scope=Scope.SESSION, operation="prune", scope_id="sess_456")

Memory Scopes

The four scopes are the heart of MemBus. Each one answers the question: who should remember this, and for how long?

Scope Lifetime Use it for
user Forever (until deleted) Preferences, name, history — anything tied to a person
session One conversation Scratchpad state, context window overflow
agent Long-lived An agent's private notes, persona, learned behaviours
org Shared across the team Research findings, shared context, team knowledge
# Each scope is fully isolated — same key, different scope = different memory
bus.write("status", "active",   scope=Scope.USER,    scope_id="u1")
bus.write("status", "thinking", scope=Scope.SESSION,  scope_id="s1")
bus.write("status", "idle",     scope=Scope.AGENT,    scope_id="researcher")

Storage Adapters

Your server decides where memories actually live. The client doesn't care — it just calls the API.

Adapter Backed by Survives restarts Best for
memory RAM Dev & testing — zero infra
redis Redis Fast, session-friendly production
supabase Postgres Persistent, Postgres-backed
chroma ChromaDB Semantic / vector memory

Switch adapters in one line on your server:

# In your server's .env
MEMBUS_ADAPTER=supabase

No client code changes. Ever.

You can also declare which adapter you expect in your client code — MemBus will warn you if there's a mismatch:

bus = MemBus(expected_adapter="supabase")
bus.health()
# ⚠ UserWarning: expected 'supabase' but server is running 'memory'

Operations

write — store a memory

bus.write(
    key="model_preference",
    value="gpt-4o",
    scope=Scope.USER,
    scope_id="user_123",
    ttl=3600,  # optional: expire in 1 hour
)

read — retrieve a memory

model = bus.read(
    key="model_preference",
    scope=Scope.USER,
    scope_id="user_123",
    default="gpt-4o-mini",  # fallback if not found
)

manage — keep memory clean

# Remove null/empty memories
bus.manage(scope=Scope.SESSION, operation="prune", scope_id="s1")

# Remove exact duplicates
bus.manage(scope=Scope.SESSION, operation="deduplicate", scope_id="s1")

# LLM-powered compression (requires OpenAI key on server)
bus.manage(scope=Scope.SESSION, operation="compress", scope_id="s1")

flush — wipe a scope

deleted = bus.flush(scope=Scope.SESSION, scope_id="sess_456")
# → 12

stats — see what's stored

bus.stats()
# → {"total_keys": 42, "by_scope": {"user": 10, "session": 5, "agent": 20, "org": 7}, "adapter": "supabase"}

MCP Interface

MemBus is MCP-native. Expose all memory operations as tools that any MCP-compatible agent can call directly.

Standalone MCP server:

from membus import MemBus
from membus.mcp import MemBusMCPServer

bus = MemBus(
    default_scope_ids={"user": "u1", "session": "s1", "agent": "my_agent", "org": "team"},
)

server = MemBusMCPServer(bus, name="membus")
server.run()  # stdio — plug into Claude, AutoGen, CrewAI, or any MCP host

Register into an existing FastMCP server:

from membus.mcp import register_membus_tools

register_membus_tools(my_existing_mcp_server, bus)
# Adds: memory_read, memory_write, memory_manage, memory_flush, memory_stats

Multi-Agent Example (AutoGen)

from membus import MemBus, Scope
from membus.mcp import register_membus_tools
from autogen_agentchat.agents import AssistantAgent
from autogen_core.tools import FunctionTool

bus = MemBus()

# Researcher stores findings
bus.write("findings", "LLMs excel at reasoning tasks", scope=Scope.ORG, scope_id="team")

# Analyst reads them — even in a separate process or server
findings = bus.read("findings", scope=Scope.ORG, scope_id="team")

Memories flow between agents through MemBus — not through chat history. That means they survive context resets, cross-process boundaries, and outlive any single conversation.


CLI

# Open the interactive guide
membus

# Check server health
membus health --server https://your-server.onrender.com

# View memory stats
membus stats --server https://your-server.onrender.com

# Flush a scope
membus flush --server https://your-server.onrender.com --scope session --scope-id sess_456

# Show the guide again any time
membus guide

Skip the flags by setting env vars:

export MEMBUS_SERVER_URL=https://your-server.onrender.com
export MEMBUS_API_KEY=your-secret-key

membus stats   # just works
membus health

Deploy Your Own Server

MemBus client connects to a membus-server instance you control. Deploy one in minutes:

  1. Clone membus-server
  2. Push to GitHub
  3. Deploy on Renderrender.yaml is included, everything is pre-configured
  4. Set your env vars in the Render dashboard
  5. Point the client at your URL
bus = MemBus(server_url="https://your-membus.onrender.com", api_key="your-key")

Links

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

membus-0.1.0.tar.gz (11.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

membus-0.1.0-py3-none-any.whl (13.4 kB view details)

Uploaded Python 3

File details

Details for the file membus-0.1.0.tar.gz.

File metadata

  • Download URL: membus-0.1.0.tar.gz
  • Upload date:
  • Size: 11.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.10.11

File hashes

Hashes for membus-0.1.0.tar.gz
Algorithm Hash digest
SHA256 4147f0a1f8cd28a002edc9bfcc8bb9ec0e5aa0aef38d0499f690aaaeb9301bed
MD5 fdfc657d879173a80df3d447602505cc
BLAKE2b-256 aacac1aa2b36bd5dd2f0ae48525bf615461d62b7d5d20542b7d6ce403b69cc7b

See more details on using hashes here.

File details

Details for the file membus-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: membus-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 13.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.10.11

File hashes

Hashes for membus-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 5f29db493ef83bb0169c694ccb0fd94f6789c29a6852a276daedecb3724e9bfb
MD5 7eb10e47d2418d5edce8cee6e45e6a64
BLAKE2b-256 54f920ed1a589fb1735b168c949cbc6240a86a4b01bee4e1e5e11a4395d2f552

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page