Persistent Memory for AI Agents — MCP-Native. Local-First. Zero Dependencies.
Mimir is a single Rust binary that gives AI agents durable memory across sessions. One binary. One file. No Docker. No Postgres. No cloud. Just persistent memory that works with any MCP host.
curl -sSf https://raw.githubusercontent.com/Perseus-Computing-LLC/mimir/main/scripts/install.sh | shThat's it. Mimir is installed to ~/.local/bin/mimir. Start it:
mimir serve --db ~/.mimir/data/mimir.dbConnect any MCP host (Claude Desktop, Cursor, Hermes Agent, Perseus, etc.):
{
"mcpServers": {
"mimir": {
"command": "mimir",
"args": ["serve", "--db", "~/.mimir/data/mimir.db"]
}
}
}# Start Mimir
mimir serve --db memory.db &
sleep 1
# Remember a fact (via MCP JSON-RPC on stdio)
echo '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"mimir_remember","arguments":{"category":"demo","key":"hello","body_json":"{\"text\":\"Hello from Mimir!\"}"}}}' | mimir serve --db memory.db
# Search for it
echo '{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"mimir_recall","arguments":{"query":"Hello"}}}' | mimir serve --db memory.dbMimir is the only memory engine that is simultaneously MCP-native, local-first, zero-dependency, AND agent-first.
| Mimir | Mem0 | Letta | Zep | |
|---|---|---|---|---|
| Deployment | Single binary (~8MB) | Cloud + self-host | Docker/Postgres | Docker/Postgres |
| Dependencies | None (SQLite embedded) | Python + vector DB | Postgres + Python | Postgres + Go |
| MCP-Native | ✅ 36 tools | ❌ Not MCP-native | ❌ Not MCP-native | ❌ Not MCP-native |
| Offline/Local | ✅ Fully local | Cloud-dependent | Docker needed | Docker needed |
| Encryption | AES-256-GCM ✅ | ❌ | ❌ | ❌ |
| Hybrid Search | BM25 + Dense + RRF | Vector only | Vector only | Vector + Graph |
| Entity Lifecycle | Decay + Promote + Archive | ❌ | ❌ | ❌ |
| Entity Graph | Link + Traverse | ❌ | ❌ | ✅ |
| Journal Audit Trail | ✅ Immutable | ❌ | ❌ | ❌ |
| State Management | ✅ Key-value + TTL | ❌ | ❌ | ❌ |
| MCP Tools | 36 | 5 | 8 | 0 |
| GitHub Stars | ~20 | ~55K | ~15K | ~3K |
| License | MIT | Apache 2.0 | Apache 2.0 | Apache 2.0 |
Full comparison: Mimir vs Mem0 → vs Letta → vs Zep →
Mimir handles production workloads on modest hardware:
| Metric | Result |
|---|---|
| 100K entity insert | 1.01s (98,732 entities/s) |
| FTS5 recall (10 results) | 0.022s |
| Decay tick (100K entities) | 1.317s (batched, transactional) |
| Memory (100K entities) | ~85MB RSS |
| DB file size (100K) | ~45MB (with FTS5 index) |
Run it yourself: cargo test stress_100k --release -- --ignored --nocapture
Ready-to-use adapters that make Mimir the default memory backend for popular AI agent frameworks:
| Framework | Integration | Type |
|---|---|---|
| LangGraph | MimirStore |
BaseStore implementation |
| CrewAI | MimirMemoryTool |
Agent tool |
| AutoGen | MimirMemory |
Memory implementation |
Each adapter:
- Connects via MCP stdio subprocess (persistent session)
- Maps the framework's memory interface to Mimir tools
- Comes with a README quickstart (5 minutes to working)
- Has passing tests with mocked MCP transport
Any MCP-compatible framework works with Mimir directly. See Awesome Mimir for the full list.
| Tool | Description |
|---|---|
mimir_remember |
Store/update entity. Idempotent by (category, key). |
mimir_recall |
Search with FTS5/dense/hybrid modes, filters, stemming expansion. |
mimir_recall_when |
Proactive just-in-time recall: surface entities whose recall_when triggers match. |
mimir_get_entity |
Fetch one entity by ID with full body_json. |
mimir_forget |
Soft-delete (archived=1). |
| Tool | Description |
|---|---|
mimir_ask |
RAG: recall context, query LLM, return grounded answer with sources. |
mimir_embed |
Generate dense vectors via Ollama or OpenAI-compatible endpoint. |
mimir_context |
Pre-formatted markdown block for session injection. |
mimir_ingest |
Trigger connector syncs (GitHub, file watcher). |
| Tool | Description |
|---|---|
mimir_link |
Create typed relationship links between entities. |
mimir_unlink |
Remove entity links. |
mimir_traverse |
Walk entity link graph up to configurable depth. |
| Tool | Description |
|---|---|
mimir_journal |
Append structured event with actor attribution. |
mimir_timeline |
Query journal by time range with filters. |
| Tool | Description |
|---|---|
mimir_state_set |
Set key-value state with optional TTL. |
mimir_state_get |
Get state value. Returns null if expired. |
mimir_state_delete |
Delete state entry. |
mimir_state_list |
List state keys, optionally filtered by prefix. |
| Tool | Description |
|---|---|
mimir_decay |
Recalculate Ebbinghaus decay scores (batched 1000-entity transactions). |
mimir_prune |
Bulk archive by category, decay threshold, or age. |
mimir_purge |
Permanently delete archived entities + VACUUM. Destructive. |
mimir_cohere |
Autonomous coherence grooming pass — promote, decay, link, archive. |
mimir_compact |
Archive entities below decay threshold. |
mimir_reindex |
Rebuild FTS5 search index from entities table. |
| Tool | Description |
|---|---|
mimir_score |
Assign quality score (0.0-1.0). |
mimir_conflicts |
Detect near-duplicate entities via trigram similarity. |
mimir_correct |
Structured correction capture for learning from errors. |
| Tool | Description |
|---|---|
mimir_vault_export |
Export entities to .md files with YAML frontmatter. |
mimir_vault_import |
Import from .md vault directory (idempotent). |
mimir_federate |
Copy entities between workspaces. |
mimir_workspace_list |
List all distinct entity categories. |
| Tool | Description |
|---|---|
mimir_stats |
Full DB statistics across all tables. |
mimir_health |
Server and DB health check. |
mimir_bench |
Performance benchmark tracking. |
mimir_synthesize |
LLM session synthesis — extract lessons from transcripts. |
mimir_migrate |
Migrate v0.1.x DB to current schema. |
# Server
mimir serve --db /data/mimir.db
mimir serve --web --port 8767 --encryption-key ~/.mimir/secret.key
mimir serve --llm-endpoint http://localhost:11434/api/generate --llm-model llama3
mimir serve --transport sse --port 8787 --mcp-token my-secret-token
# Maintenance (operate directly on DB, no server needed)
mimir stats --db /data/mimir.db
mimir forget --db /data/mimir.db --category decision --key stale-choice --reason "superseded"
mimir prune --db /data/mimir.db --category junk --min-decay 0.1 --dry-run
mimir purge --db /data/mimir.db --dry-run
mimir decay --db /data/mimir.db
mimir reindex --db /data/mimir.db
mimir vault-export --db /data/mimir.db --vault-dir ./export/
mimir vault-import --db /data/mimir.db --vault-dir ./export/
# Key management
mimir keygen --key-file ~/.mimir/secret.key| Flag | Description |
|---|---|
--db |
SQLite database path (default: ~/.mimir/data/mimir.db) |
--web |
Start web dashboard |
--port |
Dashboard port (default: 8767) |
--web-bind |
Dashboard bind address (default: 127.0.0.1) |
--transport |
MCP transport: stdio (default), sse, or http |
--mcp-token |
Bearer token for SSE/HTTP transport auth |
--encryption-key |
AES-256-GCM key file path |
--llm-endpoint |
LLM API endpoint for mimir_ask and embeddings |
--llm-model |
LLM model name (default: llama3) |
--llm-api-key |
API key for LLM endpoints (OpenAI, Azure, etc.) |
--embedding-endpoint |
OpenAI-compatible embedding endpoint |
--connectors-config |
Path to connectors.yaml |
- FTS5 keyword search with LIKE fallback and Porter stemming expansion
- Dense vector search via cosine similarity on stored embeddings
- Reciprocal Rank Fusion (RRF) — combine keyword + vector results
- Query expansion — automatic stemming variants for broader recall
- Ebbinghaus decay — memories naturally fade unless retrieved (refresh on access)
- Layer promotion — buffer → working → core based on access frequency
- Automatic archival — stale entities archive; purge to permanently delete + VACUUM
- Always-on entities — pin critical memories for unconditional session injection
mimir_ask— natural language Q&A over stored memories via any LLM (Ollama, OpenAI, etc.)mimir_embed— generate and store dense vectors via Ollama or OpenAI-compatible/v1/embeddings- Supports single-entity and batch-category embedding
- AES-256-GCM transparent encryption for entity
body_json - Opt-in via
--encryption-keyflag mimir keygensubcommand for key generation- FTS5 index stays plaintext for search
- Built-in Axum HTTP server (
mimir serve --web --port 8767) - Dark-themed dashboard with search, entity table, vis.js graph, timeline
- Default bind:
127.0.0.1(use--web-bind 0.0.0.0to expose) - Separate SQLite connection in WAL mode for concurrent reads
- GitHub issues connector — ingest issues/PRs by repo, rate-limit aware
- File watcher — scan directories for
.md/.txt/.jsonfiles with content-hash dedup - YAML-based connector config via
--connectors-config
- stdio (default) — zero-config, works with any MCP host
- SSE — Server-Sent Events for HTTP-based MCP clients
- HTTP — REST-style MCP endpoint
- Bearer token auth — for SSE/HTTP transports
Mimir is the default memory backend for Perseus:
mimir:
enabled: true
transport: "stdio"
command: ["mimir", "serve", "--db", "~/.mimir/data/mimir.db"]
timeout_s: 30.0
merge_strategy: "local_first"
fallback_to_local: true
context_categories: ["decision", "architecture", "convention"]
context_limit: 10Mimir is built for government deployment from the ground up.
| Capability | Status |
|---|---|
| License | MIT — no copyleft, no GPL/AGPL |
| SBOM | Published — NTIA minimum elements |
| Air-gapped | Fully offline — no telemetry, no API calls, no network by default |
| Encryption at rest | AES-256-GCM, transparent, opt-in |
| Audit trail | Immutable journal with chain-of-custody |
| Supply chain | SLSA attestation in progress |
For federal buyers: See docs/federal-buyers.md for procurement information, compliance status, and deployment models (air-gapped, on-premises, classified environments).
Perseus Computing LLC is a US-owned small business. SAM.gov registration in progress. NAICS: 541715, 541511, 541512.
MIT — see LICENSE.