Labsco
MyrikLD logo

Memlord

β˜… 27

from MyrikLD

Self-hosted MCP memory server for personal use and teams

πŸ”₯πŸ”₯πŸ”₯βœ“ VerifiedPaid serviceAdvanced setup
<p align="center"> <img src="https://raw.githubusercontent.com/MyrikLD/memlord/refs/heads/main/media/logo.svg" alt="Self-hosted MCP memory server with hybrid BM25 + semantic search, backed by PostgreSQL + pgvector" width="100%"> </p> <h2 align="center">Self-hosted MCP memory server for personal use and teams</h4> <p align="center"> <a href="LICENSE"><img src="https://img.shields.io/badge/License-AGPL%203.0-blue.svg" alt="License"></a> <a href="pyproject.toml"><img src="https://img.shields.io/badge/python-3.12-brightgreen.svg" alt="Python"></a> <a href="https://github.com/MyrikLD/memlord/releases"><img src="https://img.shields.io/github/v/tag/MyrikLD/memlord?label=version&color=green" alt="Version"></a> <a href="https://github.com/modelcontextprotocol/servers"><img src="https://img.shields.io/badge/MCP-compatible-purple.svg" alt="MCP"></a> <a href="https://github.com/astral-sh/ruff"><img src="https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json" alt="Ruff"></a> <a href="https://glama.ai/mcp/servers/MyrikLD/memlord"><img src="https://glama.ai/mcp/servers/MyrikLD/memlord/badges/score.svg" alt="MCP score"></a> </p> <p align="center"> <a href="#-quickstart">Quickstart</a> β€’ <a href="#-how-it-works">How It Works</a> β€’ <a href="#️-mcp-tools">MCP Tools</a> β€’ <a href="#️-configuration">Configuration</a> β€’ <a href="#-system-requirements">Requirements</a> β€’ <a href="#-license">License</a> </p>

✨ 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
  • πŸ› οΈ 10 MCP tools β€” store, retrieve, recall, list, search by tag, get, update, delete, move, list workspaces
  • 🌐 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

MemlordOpenMemorymcp-memory-servicebasic-memory
SearchBM25 + vector + RRFVector only (Qdrant)BM25 + vector + RRFBM25 + vector
EmbeddingsLocal ONNX, zero configOpenAI default; Ollama optionalLocal ONNX, zero configLocal FastEmbed
StoragePostgreSQL + pgvectorPostgreSQL + QdrantSQLite-vec / Cloudflare VectorizeSQLite + 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 tools10515+~20
Self-hostedβœ… single processβœ… Docker (3 containers)βœ…βœ…
Memory inputManual (explicit store)Auto-extracted by LLMManualManual (Markdown notes)
Memory typesfact / preference / instruction / feedbackauto-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)
LicenseAGPL-3.0 / CommercialApache 2.0Apache 2.0AGPL-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

πŸ” 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\nall-MiniLM-L6-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])

πŸ› οΈ MCP Tools

ToolDescription
store_memorySave a memory (idempotent by content); raises on near-duplicates; optional expires_at
retrieve_memoryHybrid semantic + full-text search; returns snippets by default
recall_memorySearch by natural-language time expression; returns snippets by default
list_memoriesPaginated list with type/tag filters
search_by_tagAND/OR tag search
get_memoryFetch a single memory by name with full content
update_memoryUpdate content, type, tags, metadata, or expiry by name (and optionally rename)
delete_memoryDelete by name
move_memoryMove a memory to a different workspace
list_workspacesList workspaces you are a member of (including personal)

Workspace management (create, invite, join, leave) is handled via the Web UI.


πŸ‘¨β€πŸ’» 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: