Memlord
공식개인 및 팀을 위한 자체 호스팅 MCP 메모리 서버
Memlord MCP(으)로 무엇을 할 수 있나요?
- 유형과 태그로 메모리 저장 —
store_memory를 사용하여 사실, 선호도, 지시, 피드백, 결정 또는 통찰을 저장하고, 선택적으로 만료 시간을 설정할 수 있습니다. - 하이브리드 검색으로 메모리 검색 —
retrieve_memory에 요청하여 BM25 전문 검색과 벡터 의미 검색을 결합한 방식으로 관련 메모리를 찾고, 간결한 스니펫을 반환합니다. - 시간 표현으로 메모리 회상 —
recall_memory를 사용하여 "지난주" 또는 "어제" 같은 자연어 시간 쿼리와 일치하는 메모리를 찾습니다. - 모든 메모리 탐색 및 필터링 —
list_memories를 유형 및 태그 필터와 함께 호출하여 저장된 메모리를 페이지 단위로 넘겨볼 수 있습니다. - 드리밍을 통한 메모리 통합 —
dream프롬프트를 실행하여 어시스턴트가dream_report후보를 검토하고, 거의 중복된 항목을 통찰로 병합하며, 대체된 메모리를 비파괴적으로 폐기하도록 합니다.
문서
Self-hosted MCP memory server for personal use and teams
Quickstart • How It Works • MCP Tools • Configuration • Requirements • License
✨ Features
- 🔍 Hybrid search — BM25 (full-text) + vector KNN (pgvector) fused via Reciprocal Rank Fusion
- 📂 Multi-user — each user sees only their own memories; workspaces for shared team knowledge
- 🛠️ 11 MCP tools — store, retrieve, recall, list, search by tag, get, update, delete, move, list workspaces, dream report
- 💤 Dreaming — a guided consolidation pass (
dreamMCP prompt +dream_reporttool): finds near-duplicate and conflicting memories, merges them into insights non-destructively, driven by the client LLM - 🌐 Web UI — browse, search, edit and delete memories in the browser; export/import JSON
- 🔒 OAuth 2.1 — full in-process authorization server, always enabled
- 🐘 PostgreSQL — pgvector for embeddings, tsvector for full-text search
- 📊 Progressive disclosure — search returns compact snippets by default; call
get_memory(name)only for what you need, reducing token usage - 🔁 Deduplication — automatically detects near-identical memories before saving, preventing noise accumulation
🆚 How Memlord compares
| Memlord | OpenMemory | mcp-memory-service | basic-memory | |
|---|---|---|---|---|
| Search | BM25 + vector + RRF | Vector only (Qdrant) | BM25 + vector + RRF | BM25 + vector |
| Embeddings | Local ONNX, zero config | OpenAI default; Ollama optional | Local ONNX, zero config | Local FastEmbed |
| Storage | PostgreSQL + pgvector | PostgreSQL + Qdrant | SQLite-vec / Cloudflare Vectorize | SQLite + Markdown files |
| Multi-user | ✅ | ❌ single-user in practice | ⚠️ agent-ID scoping, no isolation | ❌ |
| Workspaces | ✅ shared + personal, invite links | ⚠️ "Apps" namespace | ⚠️ tags + conversation_id | ✅ per-project flag |
| Authentication | ✅ OAuth 2.1 | ❌ none (self-hosted) | ✅ OAuth 2.0 + PKCE | ❌ |
| Web UI | ✅ browse, edit, export | ✅ Next.js dashboard | ✅ rich UI, graph viz, quality scores | ❌ local; cloud only |
| MCP tools | 11 | 5 | 15+ | ~20 |
| Self-hosted | ✅ single process | ✅ Docker (3 containers) | ✅ | ✅ |
| Memory input | Manual (explicit store) | Auto-extracted by LLM | Manual | Manual (Markdown notes) |
| Memory types | fact / preference / instruction / feedback / decision / insight | auto-extracted facts | — | observations + wiki links |
| Time-aware search | ✅ natural language dates | ⚠️ REST only, not in MCP tools | — | ✅ recent_activity |
| Token efficiency | ✅ progressive disclosure | ❌ | — | ✅ build_context traversal |
| Import / Export | ✅ JSON | ✅ ZIP (JSON + JSONL) | — | ✅ Markdown (human-readable) |
| License | AGPL-3.0 / Commercial | Apache 2.0 | Apache 2.0 | AGPL-3.0 |
Where competitors have a real edge:
- OpenMemory — auto-extracts memories from raw conversation text; no need to decide what to store manually; good import/export
- mcp-memory-service — richer web UI (graph visualization, quality scoring, 8 tabs); more permissive license (Apache 2.0); multiple transport options (stdio, SSE, HTTP)
- basic-memory — memories are human-readable Markdown files you can edit, version-control, and read without any server; wiki-style entity links form a local knowledge graph; ~20 MCP tools
When to pick Memlord:
- You want zero-config local embeddings — ONNX model ships with the server, no Ollama or external API needed
- You run a multi-user team server with proper OAuth 2.1 auth and invite-based workspaces
- You want a production-grade database (PostgreSQL) that scales beyond a single machine's SQLite
- You manage memories explicitly — store exactly what matters, typed and tagged, not everything the LLM decides to extract
- You want a self-hosted Web UI with full CRUD and JSON export, without a cloud subscription
🚀 Quickstart
🐳 Docker
cp .env.example .env
docker compose up
HTTP server (multi-user, Web UI, OAuth)
# Install dependencies
uv sync --dev
# Download ONNX model (~23 MB)
uv run python scripts/download_model.py
# Run migrations
alembic upgrade head
# Start the server
memlord
Open http://localhost:8000 for the Web UI. The MCP endpoint is at /mcp.
🔍 How It Works
Each search request runs BM25 and vector KNN in parallel, then merges results via Reciprocal Rank Fusion:
flowchart TD
Q([query]) --> BM25["BM25\nsearch_vector @@ websearch_to_tsquery"]
Q --> EMB["ONNX embed\nparaphrase-multilingual-MiniLM-L12-v2 · 384d · local"]
EMB --> KNN["KNN\nembedding <=> query_vector\ncosine distance"]
BM25 --> RRF["RRF fusion\nscore = 1/(k+rank_bm25) + 1/(k+rank_vec)\nk=60"]
KNN --> RRF
RRF --> R([top-N results])
⚙️ Configuration
All settings use the MEMLORD_ prefix. See .env.example for the full list.
| Variable | Default | Description |
|---|---|---|
MEMLORD_DB_URL | postgresql+asyncpg://postgres:postgres@localhost/memlord | PostgreSQL connection URL |
MEMLORD_PORT | 8000 | Server port |
MEMLORD_BASE_URL | http://localhost:8000 | Public URL for OAuth (HTTP mode) |
MEMLORD_OAUTH_JWT_SECRET | memlord-dev-secret-please-change | JWT signing secret (HTTP mode) |
Set MEMLORD_BASE_URL to your public URL and change MEMLORD_OAUTH_JWT_SECRET before deploying.
🛠️ MCP Tools
| Tool | Description |
|---|---|
store_memory | Save a memory (idempotent by content); raises on near-duplicates; optional expires_at |
retrieve_memory | Hybrid semantic + full-text search; returns snippets by default |
recall_memory | Search by natural-language time expression; returns snippets by default |
list_memories | Paginated list with type/tag filters |
search_by_tag | AND/OR tag search |
get_memory | Fetch a single memory by name with full content (expired included) |
update_memory | Update content, type, tags, metadata, or expiry by name (and optionally rename) |
delete_memory | Delete by name |
move_memory | Move a memory to a different workspace |
list_workspaces | List workspaces you are a member of (including personal) |
dream_report | Read-only consolidation candidates: similar memory pairs, expired and expiring-soon memories |
The dream MCP prompt walks the client LLM through a full consolidation pass over the
dream_report output: classify similar pairs (duplicate / complementary / conflict), merge
into insight memories, retire superseded ones via expires_at — never destructively.
Workspace management (create, invite, join, leave) is handled via the Web UI.
💻 System Requirements
- Python 3.12
- PostgreSQL ≥ 15 with pgvector extension
- uv — Python package manager
👨💻 Development
pyright src/ # type check
ruff format . # format
pytest # run tests
alembic-autogen-check # verify migrations are up to date
📄 License
Memlord is dual-licensed:
- AGPL-3.0 — free for open-source use. If you run a modified version as a network service, you must publish your source code.
- Commercial License — for proprietary or closed-source deployments. Contact sergey@memlord.com or dmitry@memlord.com to purchase.