Persistent cross-session memory for Claude Code and any MCP-compatible client.
Project description
Bloom
Persistent cross-session memory for Claude Code and any MCP-compatible client.
Bloom is a single-file SQLite memory that survives between sessions. Ask Claude Code "what did we decide about X last week" and it can actually answer — by searching every prior turn it has saved.
$ pipx install bloom-mcp
$ bloom-mcp init
$ # Bloom is now wired into Claude Code. Open a new session and ask it to recall.
- Works offline. Default scoring is keyword + recency — no API key, no network.
- Optional embeddings. OpenAI, Voyage (Anthropic-recommended), or local sentence-transformers.
- Six MCP tools.
recall,remember,recent,sessions,forget,stats. - One file, one process. SQLite at
~/.bloom/loom.db. No daemon, no Docker, no cloud. - MIT-licensed. Use it however you want.
Note — Bloom is an independent open-source project, not affiliated with Anthropic. "Claude" and "Claude Code" are trademarks of Anthropic PBC.
Quickstart
1. Install
The recommended way is pipx (isolates Bloom from your system Python):
pipx install bloom-mcp
Or if you prefer plain pip / uv:
pip install bloom-mcp
# or
uv tool install bloom-mcp
2. Set up
bloom-mcp init
The wizard will:
- Pick a database location (default:
~/.bloom/loom.db). - Choose an embedder (
noneis recommended — works offline, no API key). - Tune recall settings.
- Register Bloom with Claude Code automatically (if
claudeis on your PATH).
3. Use it
In Claude Code, the assistant now has six new tools available. Try:
"Search Bloom for what we said about the postgres migration."
Claude will call recall("postgres migration") and surface relevant past turns.
What Bloom does
Bloom solves one problem: Claude Code forgets every session. Even with --resume, you lose context across days/weeks/projects. Bloom adds a tiny memory layer:
remember— store a turn (decision, learning, summary) so future sessions can find it.recall— search by query; get the top-k most relevant past turns ranked by keyword overlap, recency, and (optionally) semantic similarity.recent— pull the last N turns of a specific session.sessions— list known sessions and their turn counts.forget— delete a single turn by id.stats— DB size, schema version, embedder.
You can use it as a Python library too:
from bloom.config import Config
from bloom.db import Database
from bloom.tools import tool_remember, tool_recall
cfg = Config.load()
db = Database(cfg.db_path)
tool_remember(db, cfg, content="we picked Postgres SKIP LOCKED for the queue", session="proj-x", tags="decision")
print(tool_recall(db, cfg, query="queue choice"))
Embedders (optional)
Bloom's default none embedder uses keyword + recency scoring. It's fast, offline, and good enough for most use cases.
If you want semantic search ("find turns about that thing we discussed" without needing the exact words), pick one of:
| Provider | Install | Auth | Cost |
|---|---|---|---|
none |
(default) | — | Free |
openai |
pip install bloom-mcp[openai] |
OPENAI_API_KEY |
~$0.02 / 1M tokens |
anthropic (Voyage AI) |
pip install bloom-mcp[anthropic] |
VOYAGE_API_KEY |
~$0.02 / 1M tokens |
local |
pip install bloom-mcp[local] |
— (downloads model) | Free, ~80 MB |
Set in ~/.bloom/config.toml or via bloom-mcp init:
[embedder]
provider = "openai"
model = "text-embedding-3-small"
Configuration
~/.bloom/config.toml:
[storage]
db_path = "/home/you/.bloom/loom.db"
[recall]
top_k = 5
max_chars = 4000
snippet_max_chars = 600
[embedder]
provider = "none"
[logging]
level = "INFO"
All values can also be set via env vars: BLOOM_DB_PATH, BLOOM_EMBEDDER, BLOOM_LOG_LEVEL.
Sharing Bloom with a team
Bloom is per-user, local-first by design. Every install gets its own SQLite file. There is no cloud component, no telemetry, no shared backend. Your conversations live on your machine.
If you want a shared team memory, the right approach is:
- Each person installs Bloom locally (they get private memory).
- Run a second Bloom instance on a shared host with a team-only namespace.
- Use a small wrapper (not yet shipped — track issue #1) that fans out
rememberto both.
A first-party "team Bloom" mode is on the roadmap but not in v0.1.
How it compares
- vs mem0 — Bloom is local-first, single-file, MCP-native. Mem0 is hosted/cloud-first with richer extraction.
- vs raw vector DBs (Qdrant, pgvector) — Bloom is the application, not the storage layer. You get tools, scoring, CLI, and Claude Code integration out of the box.
- vs Claude Code's
--resume— Resume is one session. Bloom is every session, searchable.
Roadmap
- v0.2 — embedding-augmented recall (hybrid keyword + cosine)
- v0.3 — multi-tenant team mode (shared host, per-user namespaces)
- v0.4 — pruning + compaction (auto-summarize old turns to save space)
- v0.5 — alternative backends (Postgres, DuckDB)
Documentation
- Onboarding — 2-minute setup guide for new users
- Architecture
- Configuration reference
- Claude Code integration
- Security & data handling
- Contributing
License
MIT — © 2026 Jonah Tebaa.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file bloom_mcp-0.2.0.tar.gz.
File metadata
- Download URL: bloom_mcp-0.2.0.tar.gz
- Upload date:
- Size: 28.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e4f3866c2f650ed819584df984027c5b699909e77484d2405b6a4d845e6d22b9
|
|
| MD5 |
5ca0286fcf4ce564bc951fc2945510c9
|
|
| BLAKE2b-256 |
ca412bbca764b592377739721f2368fc96cf5ddd5ff5ba0aefc572838c889100
|
File details
Details for the file bloom_mcp-0.2.0-py3-none-any.whl.
File metadata
- Download URL: bloom_mcp-0.2.0-py3-none-any.whl
- Upload date:
- Size: 23.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f97e7d5a43fbb66178ad6c666d7bb6ac2f0c75dceb0fd7bbc41e14e5759cbcbd
|
|
| MD5 |
69bda40a3a8f390bcba3d28b4e4d46da
|
|
| BLAKE2b-256 |
737060f6ee2a619814d75e804de66ff738a8ec554f187c69d1082271cc8caa72
|