mnemory
Memory server
Created by Filip Pytloun
Published in fpytloun/mnemory. Publisher page
283 GitHub stars
What it is
A self-hosted, secure, feature-rich memory system for AI agents and assistants. Provides intelligent fact extraction and deduplication, with an artifact store for detailed content.
AutoGineer overview, from the brain’s own files
mnemory is a self-hosted memory system designed to provide AI agents and assistants with persistent, long-term memory. It functions as an MCP server, allowing it to integrate seamlessly with various AI clients like Claude Code, Cursor, and Open WebUI. The system uses a two-tier architecture: a vector store for fast, semantically searchable summaries and an artifact store for detailed content. It features an intelligent pipeline that performs fact extraction, deduplication, and contradiction resolution in a single LLM call. mnemory also includes a built-in management UI for monitoring and memory maintenance, along with health checks to ensure data quality. It is built for production environments with support for Qdrant, S3/MinIO, and Prometheus monitoring.
How it works
Memory model: Vector store
AutoGineer overview, from the brain’s own files
mnemory operates by intercepting information shared during agent conversations. It uses an LLM pipeline to extract facts, classify them by importance and category, and resolve contradictions against existing data. These facts are stored in a vector database for semantic search, while detailed artifacts are kept in a separate store. During interaction, the system retrieves relevant memories based on the current context and user queries. It also manages memory lifecycles using configurable time-to-live (TTL) settings and provides a health-checking mechanism to detect and fix data inconsistencies.
| Folder | Role | Files |
|---|---|---|
| .github | agent-config | 4 |
| docs | docs | 31 |
| tests | tests | 42 |
| benchmarks | folder | 16 |
| files | folder | 8 |
| integrations | folder | 40 |
| mnemory | folder | 59 |
The agent reads
- get_core_memories evidence: AGENTS.md
The agent writes
- docs/mcp-tools.md evidence: AGENTS.md
- pyproject.toml evidence: AGENTS.md
- docs/configuration.md evidence: AGENTS.md
- add_memory evidence: AGENTS.md
Requirements
Runtimes: Python >=3.11
Databases: Qdrant, Redis
API keys (by name): OPENAI_API_KEY
Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Google Antigravity, Kiro, OpenCode, Amp, Roo Code, Cline, JetBrains Junie, Devin (ex-Windsurf)
Set it up
- Not scanned by AutoGineerIts dependencies are installed by pip or uv when you run it and were not scanned by AutoGineer (9 declared). https://pypi.org/project/mnemory/
Created by Filip Pytloun. Published in fpytloun/mnemory. Licence: Apache License 2.0.
Usage
AutoGineer overview, from the brain’s own files
- Connects to AI agents via the Model Context Protocol (MCP).
- Provides a REST API for custom integrations and plugin development.
- Includes a web-based dashboard for memory management and visualization.
- Supports automatic recall and memory persistence across sessions.
- Offers built-in health checks and maintenance tools for memory quality.
- Integrates with monitoring tools like Prometheus and Grafana.
- “What did I decide last week about the database?”
- The agent performs a temporal-aware semantic search across stored memories to retrieve the specific decision made.
- “I drive a Skoda.”
- The system extracts this fact and stores it; if a later statement says 'I bought a Tesla', it updates the record instead of creating a duplicate.
Documentation by Filip Pytloun
<p align="center"> <img src="files/banner.png" alt="mnemory banner" /> </p>
mnemory
Looking for a complete Agent OS? Meet Cognis — a cloud-native, self-hosted workspace where AI agents do real work. Bring together conversations, tools, workflows, and remote executors, with long-term memory powered by mnemory and guardrails provided by Intaris.
Deletion is intentionally best effort, not a verified-erasure or compliance guarantee. Normal deletion retracts and preserves history; explicit privacy erasure attempts physical cleanup. See deletion limits.
Give your AI agents persistent memory. mnemory is a self-hosted MCP server that adds personalization and long-term memory to any AI assistant — Claude Code, ChatGPT, Open WebUI, Cursor, or any MCP-compatible client.
Plug and play. Connect mnemory and your agent immediately starts remembering user preferences, facts, decisions, and context across conversations. No system prompt changes needed.
Self-hosted and secure. Your data stays on your infrastructure. No cloud dependencies, no third-party access to your memories.
Intelligent. Uses a unified LLM pipeline for fact extraction, deduplication, and contradiction resolution in a single call. Memories are semantically searchable, automatically categorized, and expire naturally when no longer relevant.
Features
Zero config —
uvx mnemory, connect your MCP client, done. Works out of the box with any OpenAI-compatible API.Intelligent extraction — A single LLM call extracts facts, classifies metadata, and deduplicates against existing memories.
Contradiction resolution — "I drive a Skoda" + later "I bought a Tesla" = automatic update, not a duplicate.
Two-tier memory — Fast searchable summaries in a vector store + detailed artifact storage (reports, code, research) retrieved on demand.
AI-powered search — Multi-query semantic search with temporal awareness. Ask "What did I decide last week about the database?" and it finds the right memories.
Memory health checks — Built-in three-phase consistency checker (fsck) detects duplicates, contradictions, quality issues, and prompt injection. Run manually or on a schedule with auto-fix.
10+ client support — Claude Code, ChatGPT, Open WebUI, OpenClaw, Cursor, Windsurf, Cline, OpenCode, and more. Native plugins available for automatic recall/remember.
Built-in management UI — Dashboard, semantic search, memory browser with full CRUD, relationship graph visualization, and health check interface. No extra tools needed.
Production ready — Qdrant for vectors, S3/MinIO for artifacts, API key or Cognis JWT authentication, per-user isolation, Kubernetes-friendly stateless HTTP.
Secure by default — API key or Cognis JWT authentication with session-level identity binding, per-user memory isolation, anti-injection safeguards in extraction prompts.
REST API + MCP — Dual interface with the same backend. 16 MCP tools + full REST API with OpenAPI spec. Build plugins, integrations, or use directly.
Prometheus monitoring — Built-in
/metricsendpoint with operation counters and memory gauges. Pre-built Grafana dashboard included.
Quick Start
mnemory needs an OpenAI-compatible API key for LLM and embeddings. It picks up OPENAI_API_KEY from your environment automatically.
uvx mnemoryIf uvx reports No module named 'mcp.server.fastmcp', update uv. Older uv
versions on Alpine can ignore mnemory's MCP v1 dependency constraint. Until
you update uv, run:
uvx --with "mcp<2" mnemoryThat's it. mnemory starts on http://localhost:8050/mcp, stores data in ~/.mnemory/.
Now connect your client — for Claude Code, add to your MCP config:
{
"mcpServers": {
"mnemory": {
"type": "streamable-http",
"url": "http://localhost:8050/mcp",
"headers": {
"X-Agent-Id": "claude-code"
}
}
}
}Start a new conversation. Memory works automatically.
Also available via Docker, pip, or production setup with Qdrant + S3. See the full quick start guide for more clients and options.
Screenshots
<p align="center"> <img src="files/screenshots/ui-dashboard.jpg" alt="Dashboard — memory totals, breakdowns, and operation counts" width="800" /> <br><em>Dashboard with memory breakdowns by type, category, and role</em> </p>
<p align="center"> <img src="files/screenshots/ui-search.jpg" alt="Search — semantic and AI-powered search with filters" width="800" /> <br><em>Semantic search and AI-powered find with filters</em> </p>
<p align="center"> <img src="files/screenshots/ui-graph.jpg" alt="Graph — D3.js force-directed memory relationship visualization" width="800" /> <br><em>Memory relationship graph visualization</em> </p>
See all screenshots and UI features including memory browser, health checks, and artifact management.
Supported Clients
mnemory works with any MCP-compatible client. Some clients also have dedicated plugins for automatic recall/remember.
| Client | MCP | Plugin | Setup Guide |
|---|---|---|---|
| Claude Code | Yes | Yes (hooks) | Guide |
| ChatGPT | Yes (MCP connector) | -- | Guide |
| Claude Desktop | Yes | -- | Guide |
| Hermes Agent | Yes | Yes (plugin) | Guide |
| Open WebUI | Yes | Yes (filter) | Guide |
| OpenCode | Yes | Yes (plugin) | Guide |
| OpenClaw | Yes | Yes (plugin) | Guide |
| Cursor | Yes | -- | Guide |
| Windsurf | Yes | -- | Guide |
| Cline | Yes | -- | Guide |
| Continue.dev | Yes | -- | Guide |
| Codex CLI | Yes | -- | Guide |
MCP = works via Model Context Protocol (LLM-driven tool calls). Plugin = dedicated integration with automatic recall/remember (no LLM tool-calling needed).
How It Works
Storing: You share information naturally. mnemory extracts individual facts, classifies them (type, category, importance), checks for duplicates and contradictions against existing memories, and stores them as searchable vectors — all in a single LLM call.
Searching: Ask a question and mnemory generates multiple search queries covering different angles and associations, runs them in parallel, and reranks results by relevance. Temporal-aware — "what did I decide last week?" just works.
Recalling: At conversation start, your agent loads pinned memories (core facts, preferences, identity) plus recent context. During conversation, relevant memories are found automatically based on what you're discussing.
Maintaining: Memories have configurable TTL — context expires in 7 days, episodic memories in 90. Frequently accessed memories stay alive (reinforcement). The built-in health checker detects and fixes duplicates, contradictions, and quality issues.
Learn more in the architecture docs.
Benchmark
Evaluated on the LoCoMo benchmark — 10 multi-session dialogues with 1540 QA questions across 4 categories:
| System | single_hop | multi_hop | temporal | open_domain | Overall |
|---|---|---|---|---|---|
| mnemory | 63.1 | 53.1 | 74.8 | 78.2 | 73.2 |
| mnemory (gpt-oss-120b) | 66.3 | 59.4 | 68.5 | 73.8 | 70.5 |
| Memobase | 70.9 | 52.1 | 85.0 | 77.2 | 75.8 |
| Mem0-Graph | 65.7 | 47.2 | 58.1 | 75.7 | 68.4 |
| Mem0 | 67.1 | 51.2 | 55.5 | 72.9 | 66.9 |
| Zep | 61.7 | 41.4 | 49.3 | 76.6 | 66.0 |
| LangMem | 62.2 | 47.9 | 23.4 | 71.1 | 58.1 |
Configuration: gpt-5-mini for extraction, text-embedding-3-small for vectors. gpt-oss-120b via Groq is a budget alternative at ~5x lower cost with comparable quality. See configuration docs for model options and benchmarks/ for reproduction.
Documentation
| Document | Description |
|---|---|
| Quick Start | Get running in 5 minutes with any client |
| Configuration | All environment variables — LLM, storage, server, memory behavior |
| Memory Model | Types, categories, importance, TTL, roles, scoping, sub-agents |
| MCP Tools | 16 MCP tools — memory CRUD, search, artifacts |
| REST API | Full REST API, fsck pipeline, recall/remember endpoints |
| Architecture | System diagram, detailed flows for storing/searching/recalling |
| Management UI | Screenshots, features, access, UI development |
| Monitoring | Prometheus metrics, Grafana dashboard |
| Deployment | Production setup, Docker, authentication, Kubernetes |
| Development | Building, testing, linting, contributing |
| Client Guides | Per-client setup instructions (10 clients) |
| System Prompts | Templates for personality agents and custom setups |
License
Apache 2.0
docs/memory-model.md
Memory Model
Two-Tier Architecture
Fast Memory (vector store): Concise facts and summaries, max 1000 characters. Semantically searchable via embeddings. Stored in Qdrant (local embedded or remote).
Slow Memory (artifact store): Detailed content — research reports, analysis, logs, code, images, PDFs. Up to 10MB per artifact (configurable via MAX_ARTIFACT_SIZE). Stored in S3/MinIO or local filesystem. Attached to fast memories, retrieved on demand. Text artifacts support pagination; binary artifacts are returned in full.
Memory Types
| Type | Purpose | Default TTL |
|---|---|---|
preference | Likes, dislikes, style choices | Permanent |
fact | Biographical, factual information | Permanent |
episodic | Events, interactions, conclusions | 90 days |
procedural | Workflows, habits, "how to" | 60 days |
context | Session/short-term context | 7 days |
Default TTLs are configurable via environment variables (see Configuration).
Categories
Predefined categories ensure LLM discoverability:
| Category | Description |
|---|---|
personal | Personal life, family, relationships |
preferences | Likes, dislikes, style preferences |
health | Physical, mental, medical |
work | Job, career, professional |
technical | Tools, languages, infrastructure |
finance | Money, investments, billing |
home | House, appliances, maintenance |
vehicles | Cars, bikes, maintenance history |
travel | Trips, places, itineraries |
entertainment | Movies, music, books, games |
goals | Objectives, plans, ambitions |
decisions | Conclusions, choices, reasoning |
project | Project-specific (use project:<name>) |
Dynamic subcategories via prefix: project:myapp, project:demo/deployment-files.
Importance Levels
| Level | Search Weight | Use For |
|---|---|---|
low | 0.1 | Minor details, temporary notes |
normal | 0.4 | Standard memories (default) |
high | 0.7 | Important facts, key decisions |
critical | 1.0 | Essential information, always-relevant |
Search uses hybrid retrieval: dense vectors (semantic similarity via OpenAI embeddings) and BM25 sparse vectors (keyword matching via FastEmbed) are fused server-side using Qdrant's Reciprocal Rank Fusion (RRF). After fusion, an importance-based score boost is applied: score = rrf_score + importance_weight * importance_value, where importance_weight = 1 - SEARCH_SIMILARITY_WEIGHT (default 0.1). This makes importance a tiebreaker rather than a primary ranking factor. Results below SEARCH_SCORE_THRESHOLD_HYBRID (default 0.0) are filtered out. RRF score range depends on Qdrant's k constant: with the default k=1, scores are ~0.1-1.0 (similar to cosine similarity); with k=60, scores are ~0.01-0.03.
Pinned Memories
Memories with pinned: true are loaded at every conversation start via get_core_memories. Use for:
User identity facts ("Lives in Prague", "DevOps engineer")
Core preferences ("Prefers direct communication")
Agent identity ("Your name is Bob", "You speak casually")
Agent knowledge ("You researched X and concluded Y")
TTL (Time-To-Live)
Memories can have a TTL that causes them to decay (soft-expire) after a set number of days. Each memory type has a configurable default TTL (see Memory Types table above). You can override the default by passing ttl_days to add_memory.
Lifecycle:
Memory is created with
expires_atcalculated fromttl_daysWhen
expires_atpasses, the memory enters decayed state (soft-deleted)Decayed memories are excluded from search and list by default
Use
include_decayed=trueto browse historical/expired memoriesDecayed memories can be restored via
update_memory(set newttl_days)
Reinforcement: When a memory is accessed via search_memories, its TTL is automatically reset — expires_at is recalculated from now + original ttl_days. This means frequently-used memories stay alive. Controlled by TRACK_MEMORY_ACCESS config.
Pinned exemption: Pinned memories (pinned: true) are exempt from TTL — they never decay, even if expires_at is set.
Existing memories: No migration needed. Memories without TTL fields are treated as permanent.
Memory Layer
Memories have a memory_layer field that controls their role in the two-layer system:
| Layer | Source | Purpose | Recall Priority |
|---|---|---|---|
raw | remember endpoint | Provisional evidence from conversation extraction | Lower (penalized in ranking) |
consolidated | add_memory, consolidation service | Durable canonical knowledge | Higher (baseline) |
Backward compatibility: Memories without a memory_layer field are treated as consolidated.
Related metadata fields
| Field | Type | Description |
|---|---|---|
memory_layer | "raw" or "consolidated" | Which layer this memory belongs to |
superseded_by | str or null | ID of the consolidated memory that replaced this raw memory |
derived_from | list[str] or null | IDs of source raw memories (on consolidated memories from consolidation) |
Dedup isolation
The remember pipeline only deduplicates against other raw memories — it never modifies consolidated memories. This prevents noisy raw extraction from overwriting high-quality consolidated content.
Consolidation
A background consolidation service synthesizes durable knowledge from raw memories and their session summaries:
Within-session: After a session goes idle, reads the session summary + raw memories, LLM synthesizes consolidated memories
Re-consolidation: If a session continues after consolidation, new raw memories reset the session to idle. The next consolidation run is append-only — the LLM receives both new raw memories and previously consolidated memories as context, produces new consolidated outputs, and the new consolidated memory IDs are appended alongside previous ones
Automated maintenance (fsck): An automated maintenance engine keeps durable memories coherent. Auto-fsck runs incrementally — only memories changed since the last check are processed. The four-phase pipeline (security → duplicates → content quality → metadata normalization) runs with bounded LLM cost (
FSCK_MAX_LLM_CALLS). Manual fsck runs a full scan. Raw memories are excluded by defaultGarbage collection: Old superseded raw memories without artifacts are deleted after a configurable retention period. GC runs independently of fsck during the maintenance cycle
Recall ranking
Search results are scored with layer-aware penalties:
Consolidated (or absent
memory_layer): baseline scoreRaw, not superseded: small penalty (
RECALL_RAW_PENALTY, default 0.05)Raw, superseded: larger penalty (
RECALL_SUPERSEDED_PENALTY, default 0.15)
Role
The role parameter controls who the memory is about:
| Role | Description | Example |
|---|---|---|
user (default for add_memory) | Facts about the user | "User lives in Prague", "User prefers dark mode" |
assistant | Facts about the agent itself | "Your name is Bob", "You speak casually" |
When role="assistant", the server uses an agent-specific fact extraction prompt that focuses on the assistant's identity, personality, and capabilities. When role="user" (default for add_memory), user fact extraction is used. The role is stored in metadata and can be used as a filter in search_memories and list_memories.
The REST POST /api/remember endpoint also supports auto mode (role=null, the default for remember). In auto mode, the LLM extracts facts from all participants and attributes each fact to the correct role. Assistant facts are silently dropped if no agent_id is set in the session. This is the recommended mode for plugins that send full conversation exchanges.
get_core_memories uses role to organize agent-scoped memories into sections:
Agent Identity: pinned,
role=assistant, fact/preference typeAgent Knowledge: pinned,
role=assistant, other typesAgent Instructions: pinned,
role=user, agent-scoped (user preferences specific to this agent)
Scoping
user_id(required): Every memory belongs to a user. Shared across all agents. Can be set at session level via API key mapping (MCP_API_KEYS) orX-User-Idheader, eliminating the need to pass it per tool call.agent_id(optional): Set for agent-scoped memories. Two use cases:Agent identity (
role="assistant"): The agent's name, personality, capabilities, knowledge.Agent-scoped user preferences (
role="user"): User preferences that apply only to this agent (e.g., "User wants me to create commit messages").
Different agents see different agent memories but share user memories. Can be set at session level via
X-Agent-Idheader.
Sub-agents
Sub-agents allow creating multiple independent agent identities under a single session. Use a colon-separated prefix matching the session's X-Agent-Id:
X-Agent-Id: openwebui <- session agent
agent_id: openwebui:bob <- sub-agent "bob" (allowed)
agent_id: openwebui:alice <- sub-agent "alice" (allowed)
agent_id: cursor:foo <- different parent (blocked)Sub-agents are fully independent — they have their own memories and do NOT inherit from the parent agent. The session agent can access and manage all its sub-agents' memories.
Memory Metadata
Custom metadata is stored as flat fields in the Qdrant payload alongside standard fields:
| Field | Type | Description |
|---|---|---|
memory_type | str | preference, fact, episodic, procedural, context |
categories | list[str] | Category tags |
importance | str | low, normal, high, critical |
pinned | bool | Whether to include in core memories |
role | str | "user" or "assistant" — who the memory is about. Always stored as one of these two values. |
artifacts | list[dict] | Artifact metadata (id, filename, content_type, size, created_at) |
event_date | str|None | ISO 8601 UTC datetime of when the event occurred |
created_at_utc | str | UTC timestamp |
ttl_days | int|None | Original TTL setting in days (None = permanent) |
expires_at | str|None | ISO 8601 expiration timestamp (None = never expires) |
decayed_at | str|None | When memory entered decayed state (None = active) |
labels | dict|None | Client-provided key-value metadata (e.g., project, topic, conversation_id). Bypasses LLM extraction. Filterable in search/list queries. |
last_accessed_at | str|None | Last time returned in search |
access_count | int | Number of times accessed in search |
Labels
Labels are client-provided key-value metadata that can be attached to any memory. Unlike categories and memory types, labels bypass the LLM entirely — they are stored exactly as provided and never inferred or modified by the extraction pipeline.
Use Cases
Project scoping:
{"project": "myapp"}— filter memories by projectConversation tracking:
{"conversation_id": "conv-123"}— link memories to conversationsEnvironment tagging:
{"env": "prod", "region": "eu-west-1"}— tag by deployment contextCustom workflows:
{"reviewed": true, "priority": 1}— application-specific metadata
Value Types
Labels support flat values only:
| Type | Example |
|---|---|
str | "myapp" |
int | 42 |
float | 3.14 |
bool | true |
list[str] | ["tag1", "tag2"] |
Nested dicts and other complex types are not allowed.
Inheritance
When using infer=True or the remember pipeline, labels are inherited by all extracted facts. If you call add_memory(content="...", labels={"project": "myapp"}) and the LLM extracts 3 facts, all 3 get those labels.
Filtering
Labels can be used as filters in search_memories, find_memories, and list_memories. Filtering uses AND logic across multiple keys, with list values using any-of (OR) within a single key:
labels={"project": "myapp", "env": "prod"}This matches memories where labels.project == "myapp" AND labels.env == "prod".
Updating
Passing
labels={"key": "value"}toupdate_memorymerges with existing labels (caller wins on key conflicts)Passing
labels={}(empty dict) clears all labelsPassing
labels=None(or omitting) preserves existing labels
Constraints
| Constraint | Default | Config |
|---|---|---|
| Max labels per memory | 20 | LABELS_MAX_FIELDS |
| Max key length | 64 chars | LABELS_MAX_KEY_LENGTH |
| Max string value length | 1000 chars | LABELS_MAX_VALUE_LENGTH |
| Key pattern | ^[a-zA-Z_][a-zA-Z0-9_]*$ | — |
| Reserved keys | System field names (e.g., memory_type, user_id, labels) | — |
212 files · 196 not served here
- .dockerignore (not served here)
- .github/workflows/docker-publish.yml (not served here)
- .github/workflows/npm-publish.yml (not served here)
- .github/workflows/openclaw-test.yml (not served here)
- .github/workflows/python-publish.yml (not served here)
- .gitignore (not served here)
- AGENTS.md (not served here)
- ATTRIBUTION.md
- CHANGELOG.md
- Dockerfile (not served here)
- LICENSE
- Makefile (not served here)
- README.md
- benchmarks/README.md (not served here)
- benchmarks/__init__.py (not served here)
- benchmarks/fsck_allocations.py (not served here)
- benchmarks/locomo/__init__.py (not served here)
- benchmarks/locomo/__main__.py (not served here)
- benchmarks/locomo/answer.py (not served here)
- benchmarks/locomo/config.py (not served here)
- benchmarks/locomo/dataset.py (not served here)
- benchmarks/locomo/evaluate.py (not served here)
- benchmarks/locomo/ingest.py (not served here)
- benchmarks/locomo/report.py (not served here)
- benchmarks/locomo/runner.py (not served here)
- benchmarks/locomo/search.py (not served here)
- benchmarks/maintenance_fencing.py (not served here)
- benchmarks/maintenance_fsck.py (not served here)
- benchmarks/maintenance_scan.py (not served here)
- docker-compose.yaml (not served here)
- docs/README.md
- docs/architecture.md
- docs/cache-expiry-bound.md
- docs/clients/chatgpt.md (not served here)
- docs/clients/claude-code.md (not served here)
- docs/clients/claude-desktop.md (not served here)
- docs/clients/cline.md (not served here)
- docs/clients/codex.md (not served here)
- docs/clients/continue.md (not served here)
- docs/clients/cursor.md (not served here)
- docs/clients/hermes.md (not served here)
- docs/clients/open-webui.md (not served here)
- docs/clients/openclaw.md (not served here)
- docs/clients/opencode.md (not served here)
- docs/clients/windsurf.md (not served here)
- docs/configuration.md (not served here)
- docs/deletion.md
- docs/deployment.md (not served here)
- docs/development.md (not served here)
- docs/maintenance-performance.md
- docs/maintenance-recovery.md
- docs/management-ui.md
- docs/mcp-tools.md
- docs/memory-model.md
- docs/monitoring.md
- docs/quickstart.md (not served here)
- docs/resource-audit-optimizations.md
- docs/rest-api.md
- docs/system-prompts/claude-code.md (not served here)
- docs/system-prompts/openwebui-basic.md (not served here)
- docs/system-prompts/openwebui-personality.md (not served here)
- files/banner.png (not served here)
- files/screenshots/ui-check-detail.jpg (not served here)
- files/screenshots/ui-check-progress.jpg (not served here)
- files/screenshots/ui-check-results.jpg (not served here)
- files/screenshots/ui-dashboard.jpg (not served here)
- files/screenshots/ui-graph.jpg (not served here)
- files/screenshots/ui-memories.jpg (not served here)
- files/screenshots/ui-search.jpg (not served here)
- integrations/claude-code/README.md (not served here)
- integrations/claude-code/hooks.json (not served here)
- integrations/claude-code/scripts/recall.sh (not served here)
- integrations/claude-code/scripts/remember.sh (not served here)
- integrations/grafana/README.md (not served here)
- integrations/grafana/dashboard.json (not served here)
- integrations/hermes/README.md (not served here)
- integrations/hermes/__init__.py (not served here)
- integrations/hermes/client.py (not served here)
- integrations/hermes/config.py (not served here)
- integrations/hermes/helpers.py (not served here)
- integrations/hermes/hooks.py (not served here)
- integrations/hermes/plugin.yaml (not served here)
- integrations/hermes/pyproject.toml (not served here)
- integrations/hermes/tests/__init__.py (not served here)
- integrations/hermes/tests/test_config.py (not served here)
- integrations/hermes/tests/test_helpers.py (not served here)
- integrations/hermes/tools.py (not served here)
- integrations/openclaw/README.md (not served here)
- integrations/openclaw/client.ts (not served here)
- integrations/openclaw/config.ts (not served here)
- integrations/openclaw/index.test.ts (not served here)
- integrations/openclaw/index.ts (not served here)
- integrations/openclaw/openclaw.plugin.json (not served here)
- integrations/openclaw/openclaw.test.mjs (not served here)
- integrations/openclaw/package-lock.json (not served here)
- integrations/openclaw/package.json (not served here)
- integrations/openclaw/package.test.mjs (not served here)
- integrations/opencode/README.md (not served here)
- integrations/opencode/client.ts (not served here)
- integrations/opencode/helpers.test.ts (not served here)
- integrations/opencode/helpers.ts (not served here)
- integrations/opencode/hooks.test.ts (not served here)
- integrations/opencode/hooks.ts (not served here)
- integrations/opencode/index.ts (not served here)
- integrations/opencode/opencode.json (not served here)
- integrations/opencode/package.json (not served here)
- integrations/opencode/tools.ts (not served here)
- integrations/openwebui/README.md (not served here)
- integrations/openwebui/mnemory_filter.py (not served here)
- mnemory/__init__.py (not served here)
- mnemory/api/__init__.py (not served here)
- mnemory/api/auth.py (not served here)
- mnemory/api/deps.py (not served here)
- mnemory/api/evidence.py (not served here)
- mnemory/api/fsck.py (not served here)
- mnemory/api/memories.py (not served here)
- mnemory/api/recall.py (not served here)
- mnemory/api/remember.py (not served here)
- mnemory/api/schemas.py (not served here)
- mnemory/api/sessions.py (not served here)
- mnemory/api/ui.py (not served here)
- mnemory/api/ui_projections.py (not served here)
- mnemory/api/user_events.py (not served here)
- mnemory/auth.py (not served here)
- mnemory/cache.py (not served here)
- mnemory/categories.py (not served here)
- mnemory/config.py (not served here)
- mnemory/consolidation.py (not served here)
- mnemory/embeddings.py (not served here)
- mnemory/fsck.py (not served here)
- mnemory/inference.py (not served here)
- mnemory/instructions.py (not served here)
- mnemory/llm.py (not served here)
- mnemory/maintenance.py (not served here)
- mnemory/maintenance_state.py (not served here)
- mnemory/memory.py (not served here)
- mnemory/metrics.py (not served here)
- mnemory/migration.py (not served here)
- mnemory/prompts.py (not served here)
- mnemory/revisions.py (not served here)
- mnemory/sanitize.py (not served here)
- mnemory/server.py (not served here)
- mnemory/session.py (not served here)
- mnemory/sparse.py (not served here)
- mnemory/storage/__init__.py (not served here)
- mnemory/storage/artifact.py (not served here)
- mnemory/storage/session.py (not served here)
- mnemory/storage/vector.py (not served here)
- mnemory/tokens.py (not served here)
- mnemory/trusted_events.py (not served here)
- mnemory/ttl.py (not served here)
- mnemory/ui/__init__.py (not served here)
- mnemory/ui/src/input.css (not served here)
- mnemory/ui/static/css/app.css (not served here)
- mnemory/ui/static/index.html (not served here)
- mnemory/ui/static/js/api.js (not served here)
- mnemory/ui/static/js/app.js (not served here)
- mnemory/ui/static/js/fsck.js (not served here)
- mnemory/ui/static/js/graph.js (not served here)
- mnemory/ui/static/js/memories.js (not served here)
- mnemory/ui/static/js/metrics.js (not served here)
- mnemory/ui/static/js/search.js (not served here)
- mnemory/ui/static/js/sessions.js (not served here)
- mnemory/ui/static/js/user.js (not served here)
- mnemory/ui/static/vendor/alpine.min.js (not served here)
- mnemory/ui/static/vendor/chart.umd.min.js (not served here)
- mnemory/ui/static/vendor/d3.min.js (not served here)
- mnemory/ui/tailwind.config.js (not served here)
- pyproject.toml (not served here)
- tests/__init__.py (not served here)
- tests/conftest.py (not served here)
- tests/contract/fixtures/evidence_remember_v1.json (not served here)
- tests/test_agent_scoping.py (not served here)
- tests/test_api.py (not served here)
- tests/test_artifact.py (not served here)
- tests/test_cache.py (not served here)
- tests/test_cache_bounded.py (not served here)
- tests/test_categories.py (not served here)
- tests/test_config.py (not served here)
- tests/test_consolidation.py (not served here)
- tests/test_e2e.py (not served here)
- tests/test_evidence_transport.py (not served here)
- tests/test_fsck.py (not served here)
- tests/test_fsck_journal.py (not served here)
- tests/test_ghcr_workflow_contract.py (not served here)
- tests/test_jwt_auth.py (not served here)
- tests/test_labels.py (not served here)
- tests/test_llm.py (not served here)
- tests/test_maintenance.py (not served here)
- tests/test_maintenance_scheduling.py (not served here)
- tests/test_maintenance_state.py (not served here)
- tests/test_managed_inference.py (not served here)
- tests/test_memory.py (not served here)
- tests/test_memory_management_api.py (not served here)
- tests/test_metrics.py (not served here)
- tests/test_migration.py (not served here)
- tests/test_prompts.py (not served here)
- tests/test_resource_audit.py (not served here)
- tests/test_revision_preconditions.py (not served here)
- tests/test_revisions.py (not served here)
- tests/test_revisions_remote.py (not served here)
- tests/test_sanitize.py (not served here)
- tests/test_session.py (not served here)
- tests/test_sessions_api.py (not served here)
- tests/test_sparse.py (not served here)
- tests/test_tokens.py (not served here)
- tests/test_trusted_rejection.py (not served here)
- tests/test_trusted_semantic.py (not served here)
- tests/test_ttl.py (not served here)
- tests/test_user_event_ingestion.py (not served here)
- tests/test_validation_decay.py (not served here)
- uv.lock (not served here)
Advantages
- Intelligent extraction and contradiction resolution ensure memory accuracy and prevent duplicate entries. evidence: README.md
- Self-hosted architecture ensures data privacy with no third-party access to stored memories. evidence: README.md
- Supports a wide range of clients through the Model Context Protocol and dedicated plugins. evidence: README.md
Limitations
- Deletion is best-effort and does not guarantee verified erasure or compliance. evidence: README.md
- Most MCP clients require a specific system prompt instruction to initialize memory correctly. evidence: docs/README.md
Security
Risk level: Low risk
This brain runs
Agent instructions that run or fetch something (8)
AGENTS.md:docker buildx build --platform linux/amd64,linux/arm64 -t ghcr.io/fpytloun/mnemory:latest .AGENTS.md:docker buildx build --platform linux/amd64,linux/arm64 --push -t ghcr.io/fpytloun/mnemory:latest .AGENTS.md:# Unit tests (fast, no API key needed, default pytest run)AGENTS.md:They are **excluded from the default `pytest` run** via `addopts = "-m 'not e2e'"` in `pyproject.toml`.AGENTS.md:**When to run e2e tests:**AGENTS.md:Migrations run automatically on startup before the server accepts requests.AGENTS.md:Each migration has a unique ID (e.g., `001_add_sparse_vectors`), a `description`, and a `run()` methodAGENTS.md:Migrations must be **idempotent** — safe to re-run if interrupted mid-way or if multiple instances start simultaneously
MCP servers (1)
README.md(mnemory):http://localhost:8050/mcp· uses the network
- Low risk: network-instructions (AGENTS.md:88)
Attribution and licence
- Created by
- Filip Pytloun
- Declared authors
- Filip Pytloun (declared in pyproject.toml)
- Publisher
- Filip Pytloun (Community)
- Source
- fpytloun/mnemory · commit 2d83c47
- Licence
- Apache License 2.0 (files served here)
- ATTRIBUTION.md (written by AutoGineer)
- Synced
AutoGineer is not affiliated with or endorsed by Filip Pytloun.
Install from source
196 of its files are not served here, so there is no ZIP. fpytloun/mnemory at 2d83c47