Embedded, local-first memory and retrieval for AI agents. One SQLite file, no server, no API key.
Copy the AI prompt to install this server into Claude Code, Cursor, or another agent β or use 1-click editor setup below.
We haven't yet run this listing's install command through our automated sandbox check. This isn't a red flag β we're steadily working through the catalog.
π‘ Paste the JSON block into your client's configuration file under mcpServers, then restart the application.
Give your agent memory and knowledge. One file, three lines, no server, no API key.
rmbr ("remember", vowels deleted) is an embedded, local-first memory + retrieval engine for AI agents and LLM apps β what SQLite is to Postgres, rmbr aims to be to hosted memory services.
v0.2.7.
pip install rmbrgets you a working library:Memory,Index,Policy, MCP support, an optional HTTP server, PDF/DOCX ingestion, and framework adapters for LangChain/LlamaIndex/LangGraph/mem0 (all below), all implemented and tested β see docs/PLAN.md and docs/ARCHITECTURE.md for the design.
Start with three lines, then reach for exactly as much more as you need β nothing below is required to use the part above it:
Memory β durable, searchable notes your agent chooses to keep, namespaced per agentIndex β hybrid (keyword + semantic) search over your own docs, for RAGPolicy β deny-by-default access control, so one agent can't read another's memory unless you explicitly allow itBaseStore, a mem0-API-compatible drop-in, raw OpenAI/Anthropic tool-calling exportcurl it than hold a connection open β also optionalIf you only ever use the first three, that's not a "basic" use of rmbr β that is rmbr for most people. The server modes exist for the specific cases they solve, not because you're expected to grow into them.
Contents: Why Β· Quickstart Β· Multi-agent isolation Β· MCP support Β· HTTP support Β· Alternatives Β· Performance Β· Roadmap
Agents can already "remember" things across restarts β a CLAUDE.md, a system prompt, a JSON file on disk. That's not new, and rmbr isn't claiming otherwise.
What breaks is what happens as that file grows. Every fact in a static context file costs tokens on every single call, whether it's relevant to the current task or not β so it either stays small (a few dozen hand-curated notes) or turns into noise nobody's cheaply reading anymore. There's no ranking: the agent gets the whole file, or nothing, never just the 5 facts that actually matter for this turn. A static file gets more expensive and less useful the more the agent learns; a searchable memory gets more useful and stays the same cost per call. mem.recall(query) returns the k most relevant memories out of however many thousand you've accumulated β that's the actual gap between "an agent that can write to a file" and "an agent with memory."
The other place people get burned: rolling this yourself. Chunk text, embed it, throw it in a vector store β that's a legitimately easy weekend project (this one started that way too). What's easy to get wrong in that weekend project: real hybrid search (most ship vector-only or keyword-only and never notice), an embedding cache (so you're not re-embedding β and re-paying for β the same text on every call), and, if there's more than one agent involved, safe isolation between them. Most hand-rolled or framework-provided multi-agent memory either shares one blob every agent can read and write, or scopes access via a namespace/user_id parameter the calling model itself supplies β which a prompt injection can simply ask to change. rmbr's MCP tools don't expose that parameter at all; there's no field for an injected instruction to fill in.
So: rmbr exists for the gap between "stuff it in a system prompt" (doesn't scale past a few KB) and "stand up real infrastructure" (Docker, a graph database, a hosted API key) β search-quality, safely-isolated memory, as a dependency, not a service.
Concretely, rmbr gives you:
.db file β git commit it, diff it, roll it back, hand it to a teammate, attach it to a bug report, or check a known-good state into a test fixture for deterministic CI. No hosted memory service lets you do any of that.pip install rmbr, import, remember. No account, no config, no service.recall()/search() return plain strings, floats, and dicts (hit.text, hit.score, hit.metadata). Nothing to parse, no vendor SDK required to consume it β see Using results with an LLM below for how that plugs into Claude, GPT, or Gemini identically.Policy is deny-by-default; MCP tools expose no namespace parameter to override β safe by construction, not by convention.Three lines β that's the whole API for the common case. Everything below is opt-in and lives in its own section, so you only read what you actually need. Library-only by design β no CLI to learn. (python -m rmbr exists solely so MCP clients can launch the server; see MCP support below.)
agents.db doesn't need to exist first. There's no rmbr init, no template to download, nothing to provision β Memory(path, ...) (and Index(path)) create the file the moment you call them on a path that doesn't exist yet, with the right schema already in place. The one thing that does need to exist is the directory the path lives in (same as opening any file for writing) β Memory("agents.db", ...) works from wherever you run it; Memory("some/deep/agents.db", ...) needs some/ to already be there.
Index and Memory share the same .db file β open both against the same path if your agent needs a knowledge base and a memory. add_files()/add_texts() return an IngestResult: a plain list of document ids with a .timings breakdown attached (chunk_ms/embed_ms/store_ms/ann_ms/docs_per_second) β the same transparency hits.timings gives you for search, applied to ingestion, so you can see for yourself that embedding dominates the cost rather than take our word for it.
rmbr never calls a model β search()/recall() hand you back plain text and a score, and you decide what to do with it. The standard pattern (classic RAG: retrieve, then inject the retrieved text into the prompt) with Claude:
This isn't Claude-specific. hit.text is a plain Python string with no wrapper, no provider object, nothing rmbr-proprietary β the exact same context string above drops verbatim into OpenAI's messages array (client.chat.completions.create(model=..., messages=[...])) or Gemini's contents. Every mainstream chat-completion API takes the same fundamental shape (a list of role-tagged text messages), which is why "retrieve text, put it in the prompt" β the only integration contract rmbr makes β works identically across providers. Swap the SDK call, nothing else changes.
Factual signals from GitHub, npm, and our automated checks β not a rating.
No reviews yet β be the first to share how this listing worked for you.
Showcase your server listing on GitHub or your project documentation. Embed this dynamic SVG badge to highlight official listing status and live engagement.
[](https://allmcps.com/mcp/rmbr)<a href="https://allmcps.com/mcp/rmbr"><img src="https://allmcps.com/api/badge/rmbr?style=directory" alt="Rmbr on AllMCPs" /></a>