Catalog PyPI
PACKAGE EXPLORERView in registry

adaptive-memory

PyPI

Private, local memory for your coding agents. One file, no cloud, no API key.

agentsclaude-codecursorembeddingslocal-firstmcpmemory
Versions collected1
Direct dependencies4From release 4.1.0
Last observed20 Oct, 19:06 UTC

README

Version 4.1.0 documentation

Adaptive Memory

Private, local memory for your coding agents. Free and open source. No cloud, no API key.

Adaptive Memory is an MCP server that gives Claude Code, Cursor, Windsurf, Cline and other local agents a long-term memory. Memories live in one SQLite file on your machine. Search is semantic (by meaning) plus keyword, using a small embedding model that runs locally. No API key, no account, no server, no Docker.

Install

Requires Python 3.10+.

pip install adaptive-memory
adaptive-memory warmup   # optional: downloads the ~130 MB embedding model now, once

Check it works: adaptive-memory stats should print a JSON summary.

Prefer not to install anything globally? With uv, point your agent at uvx adaptive-memory instead of adaptive-memory.

Claude Code

claude mcp add adaptive-memory -- adaptive-memory

Cursor / Windsurf / Cline / Claude Desktop

Add to your MCP config:

{
  "mcpServers": {
    "adaptive-memory": { "command": "adaptive-memory" }
  }
}

If your agent can't find the adaptive-memory command, use the full Python path instead: "command": "python", "args": ["-m", "adaptive_memory"].

Copy skill/adaptive-memory/SKILL.md into your agent's skills folder, for example ~/.claude/skills/adaptive-memory/SKILL.md for Claude Code. It tells the agent when to search, what to store, and what never to store.

Try it

Restart your agent, then say: "Remember that we use PostgreSQL for the main database." In a later session ask: "Which database do we use?"

Tools

ToolWhat it does
store_memory(key, content, tags?)Save or overwrite one fact
get_memory(key)Read one memory
search(query, limit?)Find memories by meaning and keywords
list_memories(tag?, limit?)Recent memories
delete_memory(key)Remove a memory
get_stats()Count, model, database path
export_memories()Full JSON backup

Where your data lives

DefaultOverride
Database~/.adaptive-memory/memory.dbADAPTIVE_MEMORY_DB
Model cache~/.adaptive-memory/models/ADAPTIVE_MEMORY_HOME
Embedding modelBAAI/bge-small-en-v1.5ADAPTIVE_MEMORY_MODEL

Use a different ADAPTIVE_MEMORY_DB per project if you want separate memories. To back up, copy the database file or run adaptive-memory export > backup.json.

How it works

  • One SQLite file with an FTS5 keyword index and stored vectors.
  • Search merges keyword and semantic rankings. If the embedding model can't load, it falls back to keyword search and says so.
  • Changing the embedding model re-embeds your memories automatically. Nothing is lost.
  • Brute-force vector search is fast up to tens of thousands of memories, which is far more than a coding agent will write.

study/eval_embeddings.py scores retrieval on 20 memories, 20 paraphrased questions (no shared wording, e.g. "who signs off schema changes?" for "Priya approves all database migrations") and 10 exact-term queries. Top-1 accuracy:

Embedding model (all run locally)ParaphraseExact terms
BAAI/bge-small-en-v1.5 (default, 130 MB)85-90%100%
sentence-transformers/all-MiniLM-L6-v290%100%
BAAI/bge-base-en-v1.590%100%
Keyword search only45%n/a

Set OPENAI_API_KEY and rerun the script to add OpenAI text-embedding-3-small to the table. The set is small, so treat the numbers as a sanity check, not a benchmark. Switch models with ADAPTIVE_MEMORY_MODEL; memories are re-embedded automatically.

Is SQLite enough? (Do I need Postgres?)

Yes for this use. Search keeps all vectors in memory and compares them with one matrix multiply. Measured median search time (384-dim vectors, 8-word memories):

MemoriesSearch timeDatabase size
1,0002 ms< 1 MB
10,00020 ms22 MB
50,000130 ms111 MB
100,000260 ms221 MB

A coding agent writes hundreds or low thousands of memories. Postgres + pgvector only pays off with millions of memories or many users sharing one server.

Remote use (optional)

The default is local and private. If you want one memory shared across machines, or want to use it from claude.ai as a custom connector, run the HTTP mode on a small server:

export ADAPTIVE_MEMORY_TOKEN=$(python -c "import secrets; print(secrets.token_urlsafe(32))")
adaptive-memory serve-http --host 0.0.0.0 --port 8000
  • Endpoint: https://your-host/mcp, with header Authorization: Bearer <token>.
  • The token is required (at least 24 characters); the server refuses to start without it.
  • Put it behind HTTPS (a reverse proxy such as Caddy, or your host's built-in TLS). Never expose plain HTTP to the internet.
  • One server holds one person's memories (single user). Keep ~/.adaptive-memory on a persistent disk.
  • Note this trades away the "nothing leaves your machine" guarantee: your memories now live on that server.

Client config, for agents that support HTTP MCP servers:

{ "mcpServers": { "adaptive-memory": {
  "url": "https://your-host/mcp",
  "headers": { "Authorization": "Bearer <token>" } } } }

Works where

Agents that run on your machine and can start a local process: Claude Code, Cursor, Windsurf, Cline, VS Code Copilot, Zed, Claude Desktop. It does not work in the claude.ai website or phone apps, which can't reach a process on your computer.

Privacy

Memories never leave your device. The only network call is the one-time model download from Hugging Face. Do not store passwords or API keys in memory.

License

Apache License 2.0. See LICENSE.

Downloads & popularity

Awaiting observations

No metric observations yet

Download counts and popularity will appear here as the collector receives them.

Versions 1

Collected releases
VersionPublishedDirect dependenciesOpen version
4.1.018 Oct 20264

Package advisories

0
No matching advisories collected

This describes our collected data; it is not a security assessment.

Repository

PENDING
rakesh1308/adaptivememoryengine

Shared repository data · GitHub

License detected in repository
Not collected

Metadata history

Meaningful changes
Current collected state Current

Observed since 20 Oct, 19:06 UTC

No superseded metadata states collected. Unchanged observations do not create new revisions.

Record identity

package:e0107e0f82cfee8e8f300713ce2f27c38d59ff58bcb60b873553db64c6c454b6