mnemon-mcp
mnemon-mcp
Постоянная многоуровневая память для ИИ-агентов. Локально в первую очередь. Без облаков. Один SQLite-файл.
Страница проекта · npm · GitHub
Ваш ИИ-агент забывает всё после каждого сеанса. Mnemon это исправляет.
Он даёт любому MCP-совместимому клиенту — OpenClaw, Claude Code, Cursor, Windsurf или вашему собственному — структурированную долговременную память на основе одной SQLite-базы на вашей машине. Никаких API-ключей, никакого облака, никакой телеметрии. Просто npm install — и ваш агент запоминает.
Зачем нужна многоуровневая память?
Плоские хранилища «ключ-значение» ставят в один ряд «что было вчера» и «никогда не коммить без тестов». Это неправильно — разные виды знаний имеют разное время жизни и разные паттерны доступа.
Mnemon организует воспоминания в четыре уровня:
Уровень | Что хранит | Как доступен | Время жизни |
Эпизодический | События, сеансы, журнальные записи | По дате или периоду | Затухает (период полураспада 30 дней) |
Семантический | Факты, предпочтения, связи | По теме или сущности | Стабильно |
Процедурный | Правила, рабочие процессы, соглашения | Загружается при запуске | Редко меняется |
Ресурсный | Справочные материалы, заметки о книгах | По требованию | Затухает медленно (90 дней) |
Журнальная запись с прошлого вторника и правило кодирования, которое никогда не меняется, живут в разных уровнях — потому что так и должно быть.
Related MCP server: persistent-kb-mcp
Качество поиска
Качество поиска оценивается на золотом наборе из 50 случаев на реальном двуязычном (RU/EN) корпусе из 797 воспоминаний, через реальный MCP-сервер, а не его переработку. Текущие показатели (методология и история):
Метрика | Только FTS | Только векторы | Гибрид (RRF) |
Композитный балл | 88,9 | 89,2 | 91,7 |
Полнота@5 | 0,907 | 0,898 | 0,919 |
MRR | 0,817 | 0,832 | 0,878 |
nDCG@5 | 0,816 | 0,828 | 0,869 |
Точность по негативам | 1,000 | 1,000 | 1,000 |
Гибрид превосходит обе ветви по отдельности, что и есть главный аргумент в пользу их объединения: лексический поиск даёт лучшую сырую полноту, векторный — лучшее ранжирование, а RRF сохраняет оба преимущества, а не усредняет их.
В документации по оценке также отслеживаются и неудачи — дрейф оценок при росте корпуса, ошибка весов полей BM25, которую выявила оценка, два случая, когда объединение всё ещё проигрывает чистому лексическому поиску, и что золотой набор не покрывает. Цифры, которые нельзя проверить, — это маркетинг; читайте, как они получены.
Архитектура
flowchart LR
C["MCP client<br/>Claude Code · Cursor · …"] -- "stdio / HTTP" --> T["10 tools · 4 resources · 3 prompts"]
T --> R["retrieval pipeline<br/>FTS5 · vector · RRF fusion"]
T --> M["memories + supersede chains"]
I["KB import pipeline<br/>markdown → memories"] --> M
M -- triggers --> F["FTS5 index (stemmed EN+RU)"]
R --> F
R --> V["sqlite-vec (optional, BYOK)"]Один SQLite-файл хранит воспоминания, индекс FTS5 и опциональный векторный индекс. Запись идёт через транзакции, поддерживающие инвариант цепочки замещения; чтение выполняется через конвейер поэтапного поиска, описанный в разделе Поиск.
Полная картина — границы модулей, пути записи/чтения, инварианты и известные ограничения — в docs/ARCHITECTURE.md. Проектные решения зафиксированы в ADR: ядро SQLite+FTS5, гибридный поиск RRF, синхронный драйвер, модель многоуровневой памяти.
Быстрый старт
Установка
npm install -g mnemon-mcpИли из исходников:
git clone https://github.com/nikitacometa/mnemon-memory-mcp.git
cd mnemon-memory-mcp && npm install && npm run buildНастройка MCP-клиента
openclaw mcp register mnemon-mcp --command="mnemon-mcp"Или добавьте в ~/.openclaw/mcp_config.json:
{
"mnemon-mcp": {
"command": "mnemon-mcp"
}
}Добавьте в ~/.claude/mcp.json:
{
"mcpServers": {
"mnemon-mcp": {
"command": "mnemon-mcp"
}
}
}Добавьте в конфиг MCP вашего клиента:
{
"mcpServers": {
"mnemon-mcp": {
"command": "mnemon-mcp"
}
}
}Используйте полный путь к скомпилированной точке входа:
{
"mnemon-mcp": {
"command": "node",
"args": ["/absolute/path/to/mnemon-mcp/dist/index.js"]
}
}Проверка
echo '{"jsonrpc":"2.0","method":"tools/list","id":1}' | mnemon-mcpВ ответе вы должны увидеть 10 инструментов. База данных (~/.mnemon-mcp/memory.db) создаётся автоматически при первом запуске.
Вот и всё. Теперь у вашего агента есть постоянная память.
Возможности
10 MCP-инструментов
Инструмент | Что делает |
| Сохраняет воспоминание с уровнем, сущностью, уверенностью, важностью и опциональным TTL |
| Полнотекстовый или точный поиск с фильтрами по уровню, сущности, дате, области, уверенности |
| Обновляет на месте или создаёт версионированную замену (цепочка замещения) |
| Удаляет воспоминание; при наличии реактивирует его предшественника |
| Показывает статистику по уровням или историю версий конкретного воспоминания |
| Экспорт в JSON, Markdown или Claude-md с фильтрами |
| Диагностика: истёкшие записи, осиротевшие цепочки, устаревшие воспоминания; опционально сборка мусора |
| Запускает сеанс агента — возвращает ID сеанса для группировки воспоминаний |
| Завершает сеанс с опциональным резюме; возвращает длительность и количество воспоминаний |
| Список сеансов с фильтрами по клиенту, проекту или статусу активности |
MCP-ресурсы и промпты
Ресурсы — живые данные, которые может читать ваш агент:
URI | Возвращает |
| Сводная статистика по уровням |
| Воспоминания, созданные/изменённые за последние 24 часа |
| Все активные воспоминания уровня |
| Все активные воспоминания о сущности |
Промпты — готовые рабочие процессы:
Промпт | Назначение |
| «Расскажи всё, что знаешь об X» |
| Загрузить релевантный контекст перед началом задачи |
| Создать структурированную журнальную запись |
Поиск
Четыре режима, все поддерживают фильтры по уровню / сущности / области / дате / уверенности:
Режим FTS (по умолчанию без эмбеддингов) — токенизированный полнотекстовый поиск с ранжированием BM25. Многословные запросы используют И; если результатов слишком мало, ИЛИ дополняет с понижением балла. Прогрессивное ослабление И перебирает топ-3 наиболее специфичных термина, прежде чем перейти к полному ИЛИ.
Гибридный режим (по умолчанию при настроенных эмбеддингах) — объединяет FTS5 + векторный поиск через Reciprocal Rank Fusion. Обнаруживает сущности в кавычках в запросах (например, 'Essentialism') и выполняет взвешенные подзапросы для перекрёстного поиска.
Векторный режим — чистый поиск по косинусной близости эмбеддингов.
Точный режим — поиск по подстроке LIKE для точного поиска фраз.
Оценки: bm25 × (0,3 + 0,7 × важность) × затухание(уровень) × недавность
Бонус за недавность: 1 / (1 + днейС / 365) — мягко вознаграждает недавно созданные воспоминания, не наказывая старые.
Стемминг
Стеммер Snowball применяется и при индексации, и при выполнении запроса для английского и русского языков. Это означает, что "running" соответствует "runs", а "книги" — "книга". Стоп-слова отфильтровываются из запросов для повышения точности.
Версионирование фактов
Знания развиваются. Mnemon не удаляет старые факты — он выстраивает их в цепочку:
v1: "Team uses React 17" → superseded_by: v2
v2: "Team uses React 19" → supersedes: v1 (active)Поиск возвращает только последнюю версию. memory_inspect с include_history: true показывает всю цепочку. memory_delete реактивирует предшественника — ничего не теряется.
Векторный поиск (опционально, BYOK)
Включите семантический поиск по близости, указав свой API эмбеддингов:
# OpenAI
MNEMON_EMBEDDING_PROVIDER=openai MNEMON_EMBEDDING_API_KEY=sk-... mnemon-mcp
# Ollama (local, free)
MNEMON_EMBEDDING_PROVIDER=ollama mnemon-mcpЭто открывает два дополнительных режима поиска:
mode: "vector"— чистый поиск по косинусной близостиmode: "hybrid"— FTS5 + векторы через Reciprocal Rank Fusion
Требуется sqlite-vec (устанавливается как опциональная зависимость). Новые воспоминания встраиваются при добавлении; существующие можно дополнительно обработать.
Переменная | По умолчанию | Описание |
| — |
|
| — | API-ключ (обязателен для OpenAI) |
|
| Название модели |
|
| Размерность векторов |
|
| Конечная точка Ollama |
Импорт базы знаний
Есть папка с Markdown-файлами? Импортируйте их пакетно:
cp config.example.json ~/.mnemon-mcp/config.json # edit this first
npm run import:kb -- --kb-path /path/to/your/kb # incremental (skips unchanged files)Конфиг сопоставляет glob-шаблоны с уровнями памяти:
{
"owner_name": "your-name",
"extra_stop_words": [],
"mappings": [
{
"glob": "journal/*.md",
"layer": "episodic",
"entity_type": "user",
"entity_name": "$owner",
"importance": 0.6,
"split": "h2"
},
{
"glob": "people/*.md",
"layer": "semantic",
"entity_type": "person",
"entity_name": "from-heading",
"importance": 0.8,
"split": "h3"
}
]
}Поля конфигурации
Поле | Тип | Описание |
| string | Ваше имя — используется для подстановки |
| string[] | Слова для фильтрации из FTS-запросов (например, формы вашего имени) |
| string | Шаблон файла для сопоставления |
| string | Целевой уровень памяти |
| string |
|
| string | Литеральное имя, |
| string |
|
| number | 0,0–1,0, влияет на ранжирование поиска |
| number | 0,0–1,0, фильтруется при поиске |
| string | Необязательное пространство имён |
HTTP-транспорт
Для удалённых сценариев или нескольких клиентов:
MNEMON_AUTH_TOKEN=your-secret MNEMON_HOST=0.0.0.0 MNEMON_PORT=3000 npm run start:httpКонечная точка | Описание |
| MCP JSON-RPC (Bearer-аутентификация, если задан токен) |
|
|
По умолчанию привязывается к 127.0.0.1. Привязка к любому другому хосту требует MNEMON_AUTH_TOKEN — сервер отказывается предоставлять хранилище памяти в сеть без аутентификации (переопределите с помощью MNEMON_ALLOW_INSECURE_HTTP=1 в доверенной сети). Ограничение скорости (100 запросов/мин/IP по умолчанию), опциональный CORS, лимит тела 1 МБ, безопасная по времени аутентификация, корректное завершение работы по SIGTERM.
Справочник по конфигурации
Переменная | По умолчанию | Описание |
|
| Путь к базе данных |
|
| Корень базы знаний для импорта |
|
| Путь к конфигурации импорта |
| — | Bearer-токен для HTTP-транспорта |
|
| Адрес привязки HTTP-транспорта |
|
| Порт HTTP-транспорта |
| — | CORS |
|
| Максимум запросов в минуту на IP (0 = выключено) |
Справочник инструментов
Параметр | Тип | Обязательный | Описание |
| string | Да | Текст памяти (макс. 100 тыс. символов) |
| string | Да |
|
| string | Нет | Краткий заголовок (макс. 500 символов) |
| string | Нет |
|
| string | Нет | Имя сущности для фильтрации |
| number | Нет | 0.0–1.0 (по умолчанию 0.8) |
| number | Нет | 0.0–1.0 (по умолчанию 0.5) |
| string | Нет | Пространство имён (по умолчанию |
| string | Нет | Путь к исходному файлу — запускает автоматическое замещение соответствующих записей |
| number | Нет | Автоматическое истечение через N дней |
| string | Нет | Временное окно факта (ISO 8601) |
Параметр | Тип | Обязательный | Описание |
| string | Да | Текст поиска |
| string | Нет |
|
| string[] | Нет | Фильтр по слоям |
| string | Нет | Фильтр по сущности (поддерживает псевдонимы) |
| string | Нет | Фильтр по области |
| string | Нет | Диапазон дат (ISO 8601) |
| string | Нет | Фильтр временных фактов — факты, действительные на эту дату |
| number | Нет | Минимальная уверенность |
| number | Нет | Минимальная важность |
| number | Нет | Максимум результатов (по умолчанию 10, макс. 100) |
| number | Нет | Смещение для постраничной навигации |
Параметр | Тип | Обязательный | Описание |
| string | Да | Идентификатор памяти |
| string | Нет | Новое содержимое |
| string | Нет | Новый заголовок |
| number | Нет | Новая уверенность |
| number | Нет | Новая важность |
| boolean | Нет |
|
| string | Нет | Содержимое для замещающей записи |
Параметр | Тип | Обязательный | Описание |
| string | Да | Идентификатор памяти. Реактивирует предшественника, если он является частью цепочки замещения |
Параметр | Тип | Обязательный | Описание |
| string | Нет | Идентификатор памяти (опустите для агрегированной статистики) |
| string | Нет | Фильтровать статистику по слою |
| string | Нет | Фильтровать статистику по сущности |
| boolean | Нет | Показать цепочку замещения |
Параметр | Тип | Обязательный | Описание |
| string | Да |
|
| string[] | Нет | Фильтр по слоям |
| string | Нет | Фильтр по области |
| string | Нет | Диапазон дат |
| number | Нет | Максимум записей (по умолчанию все, макс. 10 тыс.) |
Параметр | Тип | Обязательный | Описание |
| boolean | Нет |
|
Возвращает: статус (healthy / warning / degraded), статистику по слоям, истёкшие записи, осиротевшие цепочки, количество устаревших/низкоуверенных записей, количество очищенных записей при cleanup=true.
Параметр | Тип | Обязательный | Описание |
| string | Да | Идентификатор клиента (например, |
| string | Нет | Область проекта для этой сессии |
| object | Нет | Дополнительные метаданные сессии |
Возвращает: id (UUID сессии), started_at (ISO 8601).
Параметр | Тип | Обязательный | Описание |
| string | Да | Идентификатор сессии для завершения |
| string | Нет | Краткое описание того, что было сделано (макс. 10 тыс. символов) |
Возвращает: id, ended_at, duration_minutes, memories_count.
Параметр | Тип | Обязательный | Описание |
| number | Нет | Максимум сессий (по умолчанию 20, макс. 100) |
| string | Нет | Фильтр по клиенту |
| string | Нет | Фильтр по проекту |
| boolean | Нет | Возвращать только незавершённые сессии (по умолчанию false) |
Возвращает: массив сессий с полями id, client, project, started_at, ended_at, summary, memories_count.
Сравнение с аналогами
mnemon-mcp | mem0 | basic-memory | Engram | Anthropic KG | |
Архитектура | SQLite FTS5 + vector | Cloud API + Qdrant | Markdown + vector | SQLite FTS5 | JSON file |
Структура памяти | 4 типизированных слоя | Плоская | Плоская | Плоская + сессии | Граф |
Поиск | FTS5 + гибридный RRF | Семантический | Гибридный | FTS5 | Точный |
Версионирование фактов | Цепочки замещения | Частичное | Нет | Нет | Нет |
Стемминг | EN + RU (Snowball) | Только EN | Только EN | Нет | Нет |
Эмбеддинги | BYOK (OpenAI / Ollama) | Встроенные | FastEmbed | Нет | Нет |
Зависимости | 0 обязательных | Qdrant, Neo4j | Python 3.12 | Go binary | Нет |
Требуется облако | Нет | Да | Нет | Нет | Нет |
Стоимость | Бесплатно | $19–249/мес | Бесплатно | Бесплатно | Бесплатно |
Установка |
| Docker + API-ключи | pip + зависимости | Go install | Встроенная |
Лицензия | MIT | Apache 2.0 | AGPL | MIT | MIT |
Расширенный конкурентный анализ с источниками: docs/COMPETITORS.md.
Разработка
npm run dev # run via tsx (no build step)
npm run build # TypeScript → dist/
npm run lint # eslint (flat config)
npm test # vitest — unit + integration + MCP dispatch + HTTP transport + hybrid RRF
npm run bench # performance benchmarks
npm run db:backup # backup databaseCI запускает сборку + линтер + тесты на Node 20 и 22, затем смоук-тестирует скомпилированный сервер через реальный JSON-RPC (tools/list должен точно соответствовать набору инструментов).
Стек: TypeScript 5.9 (строгий режим), better-sqlite3, @modelcontextprotocol/sdk, Snowball stemmer, Zod, vitest.
См. CONTRIBUTING.md для правил написания кода.
Принципы проектирования
Изолирован от сети по умолчанию — нулевая телеметрия, всегда. Из коробки ничего не покидает машину; единственный компонент, который связывается с сетью, — опциональный эмбеддер, и только с провайдером, которого вы настроили (включая локальный Ollama).
Один файл — одна база данных SQLite, ноль операций, мгновенный бэкап через копирование файла.
Детерминированный поиск — по умолчанию используется FTS5, а не эмбеддинги. Интерпретируемо, воспроизводимо, без GPU.
Структура вместо плоскости — слои кодируют паттерны доступа; цепи замещения кодируют время.
Минимализм — 4 производственные зависимости. Работает везде, где работает Node.
Измерено, а не заявлено — изменения поиска оцениваются по золотому набору, включая регрессии.
Лицензия
This server cannot be deployed
Maintenance
Related MCP Connectors
Cloud-hosted MCP server for durable AI memory
Persistent memory, knowledge graph, task management and more for AI agents via MCP.
1One memory, every AI. A shared, user-owned markdown memory your AI clients read and write over MCP.
- memnodeOAuthdev.memnode
Persistent, inspectable memory for AI agents with lineage, correction, and a hosted MCP endpoint.
Related MCP Servers
- AlicenseNot gradedqualityBmaintenanceA local-first MCP memory server providing persistent, searchable memory for AI agents, powered by SQLite.1 npm1Apache 2.0
- AlicenseNot gradedqualityDmaintenanceA local-first MCP server providing persistent, searchable knowledge base via SQLite, enabling AI agents to save and recall facts across sessions without cloud dependencies.MIT
- AlicenseNot gradedqualityDmaintenanceA local-first long-term memory system for AI coding agents, exposed as an MCP server.54 npmMIT
- AlicenseAqualityCmaintenancePersistent memory MCP server for AI agents, using SQLite with hybrid keyword and semantic search for long-term memory storage.5Do What The F*ck You Want To Public