Skip to main content
Glama
Lyellr88

marm-memory

License Python FastAPI Docker Pulls PyPI Downloads PyPI Version MCP Registry

Discord Publish CodeQL marm-memory MCP server

Приветствуются вклады! Просматривайте открытые вопросы для участия или присоединяйтесь к MARM Discord, чтобы делиться рабочими процессами, получать помощь по настройке и общаться с другими разработчиками.

Содержание

Related MCP server: Memory Crystal MCP Server

Быстрый старт

  1. Установите и выполните инициализацию с вашими предпочтительными профилями агентов:

pip install marm-mcp-server
marm-memory init --g-claude --g-codex --g-gemini

Также доступно: --g-qwen и --g-kiro. Запустите без флагов, чтобы установить в текущую папку проекта вместо домашней.

  1. Передайте управление вашему AI-компаньону. Скажите своему агенту:

"Используй навык marm-init для настройки MARM."

  1. Взаимодействуйте: Ваш агент выполнит всю настройку (Python/Docker, HTTP/STDIO, ключи и конфигурации клиента) интерактивно прямо в вашем чате.

Ручная настройка

Предпочитаете настроить всё самостоятельно:

Замените "agent" на команду CLI вашего клиента (например, claude, gemini, или qwen). Для Codex используйте codex mcp add marm-memory --url http://localhost:8001/mcp.

Если вы...

Запустите сервер

Подключите ваш MCP-клиент

Одинокий разработчик / исследователь

marm-memory start

"agent" mcp add --transport http marm-memory http://localhost:8001/mcp

Частный локальный пользователь STDIO

marm-mcp-stdio

"agent" mcp add --transport stdio marm-memory-stdio marm-mcp-stdio

Несколько агентов с общей памятью

marm-memory start --profile swarm

"agent" mcp add --transport http marm-memory http://localhost:8001/mcp

Частный высокопроизводительный рой

marm-memory start --profile swarm-max

"agent" mcp add --transport http marm-memory http://localhost:8001/mcp

Доверенная частная лаборатория/сервер

marm-memory start --profile trusted

"agent" mcp add --transport http marm-memory http://localhost:8001/mcp

  • ⚡ Быстрый запуск HTTP: Выполните marm-memory fast-start-http, чтобы запустить локальную среду выполнения, запустить консоль и сразу открыть её в браузере.

  • 🖥️ Веб-консоль: Выполните marm-memory console, чтобы мгновенно открыть локальное UI-приложение (не требуется Node.js).

  • ⚙️ Управление жизненным циклом: Управляйте фоновым демоном с помощью команд status, logs --follow, restart и stop.

  • 💡 Быстрые флаги: Используйте --no-console или --no-browser, чтобы ограничить запуск. Выполните marm-memory --help для полного списка команд.

Почему MARM Memory

Ваш AI забывает всё. MARM Memory — нет.

marm-memory предоставляет вашим агентам частную, общую память для контекста, который обычно теряется между чатами: решений, исследований, исправлений, заметок и истории проекта. Переключайтесь с Claude Code на Codex или Gemini, не теряя уже собранный контекст.

Он объединяет три вещи:

  • 🧠 Основная память (7 инструментов) хранит разговоры, заметки, записи блокнота и сводки, чтобы они оставались доступными для поиска.

  • 💻 Граф кода (5 инструментов) отображает ваш репозиторий, чтобы агенты могли находить символы, следовать по путям кода и понимать проект без повторного чтения. Укажите его на репозиторий один раз, и он будет поддерживать себя в актуальном состоянии по мере вашей работы.

  • 🧩 Граф концепций (2 инструмента) связывает людей, решения, ошибки и идеи из ваших сохранённых воспоминаний, со ссылками на соответствующий код, если он доступен. Он строится сам по мере сохранения воспоминаний.

Все 14 инструментов работают через HTTP и STDIO. Ваши агенты используют одну и ту же локальную память в разных сессиях, вместо того чтобы начинать с нуля каждый раз. Встроенная консоль позволяет просматривать и управлять сохранёнными данными.

Как это работает

Слой

Что делает

Почему это важно

Модель памяти

Сессии, структурированные логи, блокноты, сводки и семантические воспоминания

Сохраняет историю проекта доступной для поиска вместо того, чтобы она оставалась запертой в одном чате

Слой масштабирования

SQLite WAL режим, пул соединений, сериализованная очередь записи и предустановки ограничения скорости HTTP

Позволяет одному серверу поддерживать индивидуальное использование, многопользовательскую работу и всплески роя

Слой интеллекта

FTS-фильтр, семантический реранжировщик, ограниченная семантическая замена, автоматическая классификация, консолидация при записи и кандидаты на уплотнение

Сохраняет полезность поиска по мере роста памяти, не позволяя дубликатам накапливаться

Слой графа кода

Индексация репозитория, поиск символов, трассировка вызовов, обзор архитектуры и анализ влияния изменений

Даёт агентам структуру проекта без повторного чтения всей кодовой базы

Слой графа концепций

Извлечение сущностей и связей из сохранённых воспоминаний со ссылками на граф кода

Связывает решения, ошибки, инструменты и людей между сессиями вместо того, чтобы оставлять их в виде плоского текста

Слой токенов

Лёгкая поверхность из 7 основных инструментов (14 с включёнными инструментами графа), семантический реранжировщик перед извлечением и дедупликация при записи

Уменьшает количество токенов, отправляемых модели при каждом запросе, и затраты остаются предсказуемыми по мере роста памяти

Слой развёртывания

Pip, Docker, STDIO, HTTP и управляемые профили swarm, swarm-max и trusted

Позволяет запускать частную локальную память или общую многопользовательскую память с тем же MCP-интерфейсом

См. Производительность и тесты масштабирования для данных о задержке извлечения, параллелизме и стоимости записи, а также Архитектура и внутреннее устройство для механизмов каждого слоя.

Команды CLI времени выполнения

marm-memory — это локальный менеджер времени выполнения, устанавливаемый вместе с пакетом Python. Это обычные операционные команды; используйте marm-memory <command> --help для справки по флагам и примерам.

Ежедневная работа времени выполнения

marm-memory fast-start-http                # start HTTP, Console, and open the browser
marm-memory start                          # start or reuse the managed HTTP runtime
marm-memory start --profile swarm          # shared multi-agent preset
marm-memory stop                           # stop the managed runtime safely
marm-memory restart                        # restart the managed runtime
marm-memory status                         # inspect runtime, database, queue, and graph status
marm-memory logs --follow                  # follow bounded runtime logs
marm-memory console                        # start or reuse the bundled local Console

Транспорты и настройка

marm-memory http                           # run HTTP in the foreground
marm-memory stdio                          # run the strict local MCP STDIO transport
marm-memory init                           # install the MARM skill into detected agents (project scan)
marm-memory init --g-claude                # install the skill into the home-folder claude directory
marm-memory doctor                         # diagnose the local install
marm-memory key init                       # create or reuse ~/.marm/.env without displaying the key
marm-memory key path                       # print the managed key-file path
marm-memory key reveal                     # explicitly display the managed key
marm-memory console --import-key           # open an authenticated local Console session
marm-memory upgrade --check                # compare the installed package with PyPI
marm-memory uninstall                      # preview package removal; always preserves ~/.marm

Знания, проекты и обслуживание

marm-memory knowledge status               # Indexers, models, and how far behind automatic indexing is
marm-memory knowledge build --all          # Rebuild the whole concept graph (new memories index themselves)
marm-memory knowledge auto off             # Stop indexing memories automatically (on, off, status)
marm-memory projects list                  # List all tracked workspaces
marm-memory projects index <path>          # Add a repo to the code graph (kept current after that)
marm-memory projects status                # Inspect target repo graph readiness
marm-memory projects auto off              # Stop re-indexing repos automatically (on, off, status)
marm-memory maintenance status             # Check internal database optimization state
marm-memory maintenance embeddings migrate # Upgrade old 384-dim vectors to 512-dim
marm-memory maintenance chunks rechunk     # Recalibrate long memory text splits

Команды Docker документируются отдельно ниже, поскольку они требуют явного монтирования данных, открытия сети и выбора обработки ключей.

Производительность и тесты масштабирования

MARM оптимизирован в первую очередь для быстрого поиска, даже при росте памяти и разбиении длинных воспоминаний на части в фоновом режиме.

Эти измерения используют кодировщик jinaai/jina-embeddings-v2-small-en на базе fastembed и временную локальную базу данных SQLite. Каждый замеренный путь вызывает поставляемый код MARMMemory, а не локальную реализацию бенчмарка. Разделы 1-4 — это временные замеры из одного запуска scripts/benchmarking/performance/bench_hotpath.py на локальном оборудовании; абсолютные миллисекунды различаются в зависимости от машины, поэтому рассматривайте форму масштабирования как сигнал. Раздел 5 — это отдельный бенчмарк точности (run_eval.py) и сообщает два запуска по указанной причине.

1. Масштабирование задержки извлечения

Сквозная задержка recall_similar (включает кодирование запроса).

Размер сессии ($N$)

Мин. задержка

Медианная задержка

p95 задержка

N = 100

7.4 мс

7.9 мс

9.4 мс

N = 250

11.9 мс

13.5 мс

15.4 мс

N = 500

10.9 мс

11.8 мс

13.4 мс

N = 1,000

13.3 мс

13.5 мс

15.6 мс

N = 2,000

17.5 мс

18.2 мс

19.6 мс

N = 4,000

23.8 мс

25.9 мс

30.9 мс

Разброс от запуска к запуску при малом $N$ больше, чем разрыв между соседними размерами, поэтому N = 250 читается медленнее, чем N = 500. Рассматривайте тренд от N = 1,000 и выше как реальный сигнал.

2. Кодировщик + параллелизм

  • Холодная загрузка модели: 893 мс

  • Тёплое кодирование: медиана 3.8 мс, p95 4.3 мс

  • Параллельный поиск: 10 собранных поисков завершены за 151.5 мс против 176.0 мс последовательно (gather/serial = 0.86). Не интерпретируйте это как параллелизм: повторные запуски этого же бенчмарка дают значения от 0.63 до 0.86, поэтому соотношение недостаточно стабильно, чтобы утверждать ускорение. Путь по замыслу сериализован вокруг общего кодировщика и работы SQLite, и любое кажущееся ускорение — это шум измерений.

3. Стоимость обработки при записи

  • Консолидация выключена: медиана 6.5 мс, p95 7.6 мс

  • Консолидация включена: медиана 58.1 мс, p95 106.5 мс

  • Компромисс: дедупликация/кластеризация при записи добавляет в 9.0x медианную стоимость, чтобы поиск оставался быстрым, а хранилище — чище со временем. Консолидация выключена по умолчанию.

4. Масштабирование поиска: полное сканирование против гибридного режима производства

Почему recall остается стабильным при росте памяти: вместо сканирования каждого вектора production-recall использует FTS-ключевой префильтр для сужения пула кандидатов, а затем повторно ранжирует с помощью смешанной семантической + BM25 + временной оценки. Оба бенчмарковых столбца представляют собой аутентичные асинхронные пути кода, синхронизированные по времени с предварительно вычисленными векторами, чтобы изолировать скорость извлечения от накладных расходов на кодирование. Тесты чередуют выполнение для обеспечения полностью беспристрастных условий кэша.

Размер сессии ($N$)

Полное семантическое сканирование

Гибридная система в production

Ускорение

FTS-кандидаты

N = 100

3.3 мс

6.6 мс

0.5x

85 / 200

N = 500

16.3 мс

11.6 мс

1.4x

200 / 200

N = 1,000

31.1 мс

14.7 мс

2.1x

200 / 200

N = 2,000

63.5 мс

19.0 мс

3.3x

200 / 200

N = 4,000

127.2 мс

29.1 мс

4.4x

200 / 200

N = 10,000

316.7 мс

53.8 мс

5.9x

200 / 200

Полное сканирование растет примерно линейно с $N$, в то время как гибридный recall растет гораздо медленнее, поэтому преимущество все еще увеличивается с размером сессии. При очень маленьком $N$ префильтр не оправдывает своих накладных расходов, и гибридная система работает медленнее.

5. Точность извлечения LoCoMo

Все 10 диалогов LoCoMo загружаются через marm_log_entry (5 882 воспоминания), затем результаты top-5 marm_smart_recall оцениваются по 1 977 вопросам с аннотированными доказательствами. Модель генерации ответов или LLM-судья не используются.

Конфигурация

Любое попадание доказательства

Все попадания доказательств

Средний отзыв по доказательствам

MiniLM baseline

37.5%

29.5%

не опубликовано

Jina v2 Small (v2.29.0)

53.0%

43.4%

47.6%

Недавняя (v2.33.1)

62.9 - 63.5%

53.1 - 53.5%

57.4 - 57.9%

Прирост производительности изолирован в гибридном конвейере извлечения и локализованном векторном пространстве, что обеспечивает высокую точность извлечения с несколькими переходами без использования облачных LLM-судей. Воспроизведите полный бенчмарк с помощью scripts/benchmarking/accuracy/locomo/run_eval.py.

6. Сравнение с конкурентами: Архитектура

MARM нацелен на определенную нишу: локальная память для MCP-подключенных кодирующих агентов, а не общая персонализированная память или полноценная среда выполнения агента. Вот чем он архитектурно отличается от известных имен в области памяти ИИ-агентов:

MARM

Mem0

Letta (MemGPT)

Zep / Graphiti

agentmemory

Тип

Движок памяти, нативный MCP

API уровня памяти

Полноценная среда выполнения агента

Граф временных знаний

Движок памяти, нативный MCP

Требуемая инфраструктура

Нет отдельного сервиса данных (встроенный SQLite)

Векторная БД (Qdrant/pgvector)

Postgres + векторная БД

Neo4j

Отдельная среда выполнения iii-engine

Развертывание

Локально по умолчанию; Docker для общего/удаленного доступа

Облачный API или самостоятельное размещение

Самостоятельное размещение или облако

Облако или самостоятельное размещение

Локально

Модель извлечения

Гибрид: точный FTS5 BM25 + семантический повторный ранжинг

Вектор + граф + ключ-значение

Векторное архивное хранилище + управляемая агентом основная память

Граф временных знаний (окна достоверности фактов)

BM25 + вектор + граф (RRF-слияние)

Захват записи

Явные вызовы инструментов от подключенного агента

Явные вызовы add() (некоторые интеграции автоматически извлекают)

Агент самостоятельно редактирует свою память

Явные вызовы API

Хуковый, автоматический (не требует явных вызовов)

Осведомленность о структуре кода

Встроенный граф кода + граф концепций, объединенные с памятью

Не встроено

Не встроено

Не встроено

Не встроено (работает в паре с отдельным проектом)

Привязка к фреймворку

Нет (любой MCP-клиент)

Нет

Высокая (должен работать внутри Letta)

Нет

Нет (любой MCP-клиент)

Отказ от ответственности и точность: Ландшафт конкурентов быстро меняется. Приведенная выше матрица отражает основные архитектурные особенности по состоянию на Q3 2026, основанные на общедоступной документации и README, а не на внутреннем тестировании каждой системы. Если какой-либо пункт данных относительно альтернативного фреймворка изменился или был искажен, пожалуйста, откройте issue или отправьте Pull Request для обновления таблицы. Мы активно приветствуем исправления от коллег-мейнтейнеров.

Настройка MCP-клиента для HTTP и STDIO

Ручная установка через pip

pip install marm-mcp-server

Используйте это краткое правило для выбора настройки

  • Локальный HTTP/STDIO = самая быстрая однокомпьютерная настройка.

  • Docker HTTP = общий/постоянно работающий сервер (требуется ключ).

  • Docker STDIO = частное контейнеризированное локальное использование (без HTTP-ключа).

Примечание для роя/многоагентных систем: Очередь записи включена по умолчанию для сериализации записи в память через один рабочий процесс. Для общих HTTP-развертываний используйте marm-memory start --profile swarm (200 RPM) или --profile swarm-max (600 RPM). --profile trusted отключает ограничение скорости для частных развертываний. STDIO по-прежнему лучше всего подходит для частного однопользовательского/локального использования. Смотрите полную таблицу в разделе Пресеты для роя и многоагентных систем.

"agent" относится к claude, gemini, grok, qwen или любому MCP-клиенту. Codex использует --url вместо --transport для добавления MCP-инструментов.

pip install marm-mcp-server
marm-memory start
# Stuck on client setup? Open a Q&A thread: https://github.com/Lyellr88/marm-memory/discussions
# most agents use this --transport command
"agent" mcp add --transport http marm-memory http://localhost:8001/mcp
codex mcp add marm-memory --url http://localhost:8001/mcp

Запуск по умолчанию через pip/locally не требует настройки: MARM привязывается к localhost и не требует ключа, если вы не откроете доступ с помощью SERVER_HOST=0.0.0.0.

pip install marm-mcp-server
python -m marm_mcp_server.server_stdio
# most agents use this --transport command
"agent" mcp add --transport stdio marm-memory-stdio marm-mcp-stdio
codex mcp add marm-memory-stdio -- marm-mcp-stdio

Замените marm-mcp-stdio на python -m marm_mcp_server.server_stdio, если используете виртуальное окружение или настройку на основе путей. Работает с Claude Code, Cursor, VS Code, Qwen и Gemini CLI. STDIO остается единственным локальным процессом без порта и API-ключа и предоставляет те же 14 инструментов, что и HTTP.

Используйте HTTP, когда нескольким агентам нужно использовать один работающий MARM-сервер. STDIO по-прежнему лучше всего подходит для частного однопользовательского использования, потому что каждый клиент владеет своим собственным локальным процессом.

# HTTP shared server, normal multi-agent use
marm-memory start --profile swarm

# HTTP shared server, heavier private swarm
marm-memory start --profile swarm-max

# HTTP trusted private lab/server, rate limiting disabled
marm-memory start --profile trusted

# STDIO remains keyless/private and does not use swarm flags
marm-mcp-stdio

Docker HTTP требует API-ключа, потому что он открывает MARM как сетевой сервер; STDIO остается локальным для клиентского процесса и не требует его.

Если вы установили MARM через pip, интерфейс командной строки продукта может безопасно предварительно просмотреть или запустить ту же самую настройку. По умолчанию он использует порт обратной связи (loopback), сохраняет ~/.marm, хранит сгенерированный ключ в ~/.marm/.env, а не в истории оболочки, и отказывается заменять существующий контейнер.

marm-memory docker command                 # preview the exact HTTP command
marm-memory docker run                     # create the managed HTTP container
marm-memory docker stdio-command           # print a Docker STDIO client command
marm-memory docker status
marm-memory docker logs --follow
marm-memory docker stop

# Optional: mount repositories read-only for code indexing.
marm-memory docker run --repo /absolute/path/to/repository

# Optional: preview or explicitly write a Compose configuration.
marm-memory docker compose
marm-memory docker compose --yes

Команды HTTP run, command и compose принимают те же операционные флаги:

Флаг

Назначение

--data-dir <абсолютный путь>

Постоянная хост-директория, монтируемая в /home/marm/.marm. По умолчанию: ~/.marm; здесь хранятся память, индексы, логи и файл управляемого ключа.

--env-file <путь>

Явный Docker env-файл. Он уже должен содержать MARM_API_KEY; без этого флага MARM использует ~/.marm/.env и создает там ключ только тогда, когда docker run или docker compose --yes требуется.

--port <число>

HTTP-порт хоста. По умолчанию: 8001.

--expose-network

Привязать порт хоста к 0.0.0.0 вместо loopback. Это преднамеренное сетевое открытие; настройте брандмауэр и TLS-прокси.

`--profile standard

swarm

swarm-max

trusted`

Выбрать тот же пресет очереди записи и ограничения скорости, что и при нативном запуске HTTP.

--rate-limit-rpm <число>

Переопределить лимит скорости HTTP для выбранного профиля. 0 отключает ограничение скорости.

--repo <абсолютный путь>

Повторяемое монтирование репозитория только для чтения для индексации кода. MARM сообщает каждый соответствующий путь /workspace/repo-N для индексации внутри контейнера.

--tag <тег>

Официальный тег образа. По умолчанию: latest.

--pull

Скачать выбранный образ перед созданием нового HTTP-контейнера.

--name <имя>

Имя управляемого контейнера. MARM отказывается заменять существующий контейнер с таким именем.

--memory <лимит> / --cpus <лимит>

Необязательные ограничения ресурсов Docker.

--dry-run

docker run только: вывести запланированную команду без создания контейнера или файла ключа. docker command всегда является предварительным просмотром.

Например:

# Shared local server with a custom data path and two repositories for indexing.
marm-memory docker command \
  --profile swarm \
  --data-dir /srv/marm-data \
  --repo /srv/projects/api \
  --repo /srv/projects/web

# Execute the reviewed command, pulling the image first.
marm-memory docker run --profile swarm --data-dir /srv/marm-data --pull

Docker STDIO отделен от Docker HTTP: marm-memory docker stdio-command использует docker run -i --rm, не имеет порта и bearer-ключа, но по-прежнему монтирует каталог данных, чтобы SQLite-память сохранялась после завершения кратковременного контейнера. Используйте --data-dir и --tag с этой командой при необходимости. Отдельных команд docker key или docker mount нет; --env-file и --data-dir делают эти выборы явными в сгенерированной HTTP-команде.

marm-memory docker pull только загружает образ. marm-memory docker maintenance embeddings migrate выполняется с тем же монтированием данных и отказывается работать, пока управляемый HTTP-контейнер запущен. Помощник доступен только с командой marm-memory, установленной через pip; пользователи, использующие только Docker, могут использовать сырые команды ниже.

# Step 1: generate key (do not add < > around the key)
docker run --rm lyellr88/marm-mcp-server:latest --generate-key

# Step 2: run server
docker pull lyellr88/marm-mcp-server:latest
docker run -d --name marm-mcp-server \
  -p 127.0.0.1:8001:8001 \
  -e SERVER_HOST=0.0.0.0 \
  -e MARM_API_KEY=your-generated-key \
  -v ~/.marm:/home/marm/.marm \
  lyellr88/marm-mcp-server:latest

# Step 3: connect client
"agent" mcp add --transport http marm-memory http://localhost:8001/mcp --header "Authorization: Bearer your-generated-key"

# PowerShell: set this before starting/restarting Codex
$env:MARM_API_KEY="your-generated-key"
codex mcp add marm-memory --url http://localhost:8001/mcp --bearer-token-env-var MARM_API_KEY

# Quick auth smoke test
curl -i -H "Authorization: Bearer $env:MARM_API_KEY" http://127.0.0.1:8001/mcp

--bearer-token-env-var принимает имя переменной окружения, а не сам ключ. Запустите или перезапустите Codex из той же оболочки после установки $env:MARM_API_KEY. Для локальных тестов Docker MARM_API_KEY=test подходит и избегает проблем с экранированием в оболочке; для реальных развертываний используйте сгенерированный ключ. Ответ 406 Not Acceptable от тестового GET /mcp означает, что аутентификация дошла до конечной точки MCP; 401 Unauthorized означает, что ключ отсутствует или не совпадает.

# --swarm: write queue on, 200 RPM - recommended for multi-agent shared servers
docker run -d --name marm-mcp-server \
  -p 127.0.0.1:8001:8001 \
  -e SERVER_HOST=0.0.0.0 \
  -e MARM_API_KEY=your-generated-key \
  -v ~/.marm:/home/marm/.marm \
  lyellr88/marm-mcp-server:latest --swarm

Docker-инструменты для графа выполняются внутри контейнера, поэтому они не видят пути хоста, если вы не смонтируете их при docker run.

$env:MARM_API_KEY="test"

# The second -v line mounts your repo; adjust the host path to your project
docker run -d --name marm-mcp-server `
  -p 127.0.0.1:8001:8001 `
  -e SERVER_HOST=0.0.0.0 `
  -e MARM_API_KEY=$env:MARM_API_KEY `
  -v ~/.marm:/home/marm/.marm `
  -v C:\Users\lyell\Desktop\marm-memory:/workspace/marm-memory `
  lyellr88/marm-mcp-server:latest

Затем индексируйте путь контейнера, а не путь хоста Windows:

marm_graph_index(repo_path="/workspace/marm-memory")

Инструменты для графа должны использовать путь контейнера. Монтирования нельзя добавить к уже работающему контейнеру; остановите и перезапустите контейнер с монтированием репозитория, когда вам понадобится индексация графа Docker.

Docker STDIO включает те же встроенные инструменты marm-graph; дополнительный образ или этап установки не требуется.

docker run --rm -i \
  -v ~/.marm:/home/marm/.marm \
  --entrypoint python \
  lyellr88/marm-mcp-server:latest \
  -m marm_mcp_server.server_stdio

  • Docker HTTP требует ключа; Docker STDIO — нет.

  • Если вы получаете 401, проверьте совпадение ключа и перезапуск клиента после изменений переменных окружения.

  • Полная настройка ключа, ротация и устранение неполадок: INSTALL-DOCKER.md

Подключите свой клиент

Запустите сервер (python -m marm_mcp_server), затем настройте ваш клиент ниже. Каждый блок предполагает установку по умолчанию (без ключа). Для Docker или открытых серверов добавьте заголовок Authorization: Bearer, как показано в сворачиваемом блоке каждого клиента.

claude mcp add --transport http marm-memory http://localhost:8001/mcp

Claude Code поддерживает HTTP, SSE и STDIO через claude mcp add; используйте HTTP для MARM. Для STDIO: claude mcp add --transport stdio marm-memory-stdio marm-mcp-stdio.

Добавьте в .vscode/mcp.json в вашей рабочей области. Используйте marm-memory-local для прямых установок Python; marm-memory-docker для Docker или режима с ключом.

{
  "inputs": [
    {
      "type": "promptString",
      "id": "marm-api-key",
      "description": "MARM API Key for Docker or exposed server mode",
      "password": true
    }
  ],
  "servers": {
    "marm-memory-local": {
      "type": "http",
      "url": "http://localhost:8001/mcp"
    },
    "marm-memory-docker": {
      "type": "http",
      "url": "http://localhost:8001/mcp",
      "headers": {
        "Authorization": "Bearer ${input:marm-api-key}"
      }
    }
  }
}

Откройте .vscode/mcp.json, нажмите Start над нужным сервером, затем используйте Copilot Agent или любое расширение, которое использует встроенный реестр MCP VS Code.

Добавьте в .cursor/mcp.json в вашей рабочей области. Cursor использует mcpServers, а не корневой servers VS Code.

{
  "mcpServers": {
    "marm-memory-local": {
      "type": "http",
      "url": "http://localhost:8001/mcp"
    },
    "marm-memory-docker": {
      "type": "http",
      "url": "http://localhost:8001/mcp",
      "headers": {
        "Authorization": "Bearer ${env:MARM_API_KEY}"
      }
    }
  }
}

Для режима Docker/ключ запустите Cursor с установленным MARM_API_KEY в окружении.

Codex использует codex mcp add или TOML-конфигурацию в ~/.codex/config.toml (%USERPROFILE%\.codex\config.toml на Windows).

# Direct Python install - no key needed
codex mcp add marm-memory --url http://localhost:8001/mcp

# Docker or SERVER_HOST=0.0.0.0 - key required (set MARM_API_KEY in your shell first)
codex mcp add marm-memory --url http://localhost:8001/mcp --bearer-token-env-var MARM_API_KEY
[mcp_servers."marm-memory"]
url = "http://localhost:8001/mcp"
enabled = true
bearer_token_env_var = "MARM_API_KEY"
# Direct Python install - no key needed
gemini mcp add --transport http marm-memory http://localhost:8001/mcp

# Docker or SERVER_HOST=0.0.0.0 - key required
gemini mcp add --transport http marm-memory http://localhost:8001/mcp --header "Authorization: Bearer your-generated-key"

Эквивалентный ~/.gemini/settings.json (область пользователя) или проект .gemini/settings.json:

{
  "mcpServers": {
    "marm-memory": {
      "httpUrl": "http://localhost:8001/mcp",
      "headers": {
        "Authorization": "Bearer your-generated-key"
      }
    }
  }
}
# Direct Python install - no key needed
qwen mcp add --transport http marm-memory http://localhost:8001/mcp

# Docker or SERVER_HOST=0.0.0.0 - key required
qwen mcp add --transport http marm-memory http://localhost:8001/mcp --header "Authorization: Bearer your-generated-key"

Эквивалентный .qwen/settings.json (проект) или ~/.qwen/settings.json (пользователь):

{
  "mcpServers": {
    "marm-memory": {
      "httpUrl": "http://localhost:8001/mcp",
      "headers": {
        "Authorization": "Bearer your-generated-key"
      }
    }
  }
}

xAI подключается из своей собственной инфраструктуры, поэтому localhost не будет работать. Откройте MARM за HTTPS и установите MARM_API_KEY.

{
  "type": "mcp",
  "server_url": "https://your-marm-domain.example.com/mcp",
  "server_label": "marm-memory",
  "authorization": "Bearer your-generated-key"
}

Полные пошаговые руководства по платформам, настройке ключа и примечания по ОС: Windows · macOS · Linux · Docker/режим ключа · Другие платформы

Используете клиент, которого нет в списке? Откройте issue и сообщите нам; адаптеры клиентов — это запросы функций первого класса.

Требования

  • Python: 3.10 или выше

  • SQLite3: Входит в состав Python (отдельная установка не требуется)

  • Хранилище: ~100 МБ минимум для начальной установки, масштабируется в зависимости от размера базы памяти

  • ОЗУ: 512 МБ минимум (зависит от количества одновременных клиентов и размера базы)

  • ОС: Windows, macOS, Linux

Расположение данных

  • Расположение: ~/.marm/ (Linux/macOS) или %USERPROFILE%\.marm\ (Windows)

  • Содержимое: База данных SQLite со всеми воспоминаниями, сессиями и блокнотами; граф концепций находится в своей собственной базе ~/.marm/index/

  • Резервное копирование: Скопируйте весь каталог ~/.marm/, чтобы сохранить все данные

  • Конфиденциальность: Все остается на вашей машине, никакой облачной синхронизации или внешнего хранилища

Проверка установки

Используйте конечную точку здоровья MCP-сервера для самой быстрой проверки в реальном времени:

curl http://localhost:8001/health

Ожидаемый вывод включает версию сервера, доступность функций (статус семантического поиска), статус подключения к базе данных и статус работоспособности сервиса.

Полный набор инструментов MCP (14 инструментов)

💡 Совет профессионала: Вам не нужно вызывать эти инструменты вручную! Просто скажите вашему AI-агенту, что вы хотите, на естественном языке:

  • "Claude, запиши эту сессию как 'Project Alpha' и добавь этот разговор как 'обсуждение дизайна базы данных'"

  • "Запомни этот фрагмент кода в своем блокноте для последующего использования"

  • "Найди, что мы обсуждали об аутентификации вчера"

AI-агент автоматически использует соответствующие инструменты. Ручной доступ к инструментам доступен для продвинутых пользователей, которым нужен прямой контроль.

🧠 Основная память (7 инструментов)

Инструмент

Что делает

Ключевые параметры

marm_smart_recall

Гибридное воспоминание с аддитивным, ограниченным графом концепций/кода, если существует совместимый граф

query, limit, session_name, search_all, detail=1/2/3, project, platform, exact_mode

marm_log_entry

Добавить структурированные записи журнала сессии; каждая запись также встраивается в семантическую память, так что marm_smart_recall может ее найти

entry, session_name

marm_log_show

Показать все записи и сессии с фильтрацией

session_name

marm_delete

Удалить сессию журнала, запись журнала или запись блокнота

type, target, session_name, project, platform

marm_summary

Кэшированные, готовые к вставке резюме сессий с интеллектуальным усечением

session_name

marm_notebook

Черновик в рамках сессии плюс продвижение до постоянного документа, связанного с графом

action="add"|"use"|"show"|"status"|"clear"|"save", name, data, session_name, project, platform

marm_compaction

Очистка памяти с помощью агента с проверяемым журналом аудита

action="status"|"candidates"|"review"|"stage"|"apply"|"discard"

🕸️ Граф кода (5 инструментов)

Инструмент

Что делает

Ключевые параметры

marm_graph_index

Индексировать репозиторий в граф структуры кода, проверить статус, список проектов или включить/выключить автоматическую переиндексацию

repo_path, project, action

marm_code_lookup

Найти символы, текстовые шаблоны или исходник символа; используйте вместо grep/glob

kind="auto"|"symbol"|"text"|"snippet"

marm_graph_trace

Отследить пути вызовов и потоки данных от функции

direction, mode

marm_graph_architecture

Обзор архитектуры: модули, разбивка узлов/ребер, схема

project

marm_graph_impact

Радиус поражения изменений кода: git diff → затронутые символы + риск

since, base_branch, depth

🧩 Граф концепций (2 инструмента)

Инструмент

Что делает

Ключевые параметры

marm_concept_build

Перестроить граф или индексировать воспоминания, сохраненные до автоматической индексации. Новые воспоминания индексируются сами

session_name, project или search_all=True (обязательно одно)

marm_concept_recall

Явно запросить сущности, отношения и связанные символы кода

query, depth (1-5), direction, project, platform

Все 14 инструментов доступны как по HTTP, так и по STDIO. За поверхностью инструментов сервер автоматически обрабатывает настройку жизненного цикла, обновление протокола, индексацию документации, контекст даты, обслуживание кэша резюме, обработку очереди записи, индексацию концепций, переиндексацию кода при изменении репозиториев, атрибуцию проекта/платформы и проверки здоровья; ни одно из этих действий не потребляет внимания или токенов агента. Два движка графа запускаются лениво при первом использовании и никогда не блокируют 7 основных инструментов памяти, если они не могут запуститься. См. Архитектура и внутренности для механизмов.

Использование MARM: Говорите, а не вызывайте инструменты

MARM внутренне обрабатывает работу жизненного цикла. Документация и состояние сессии инициализируются при первом реальном вызове инструмента, а встроенная документация индексируется в пространство имен памяти marm_system с отслеживанием хэша исходного файла, так что ваш агент может отвечать на вопросы об использовании MARM из самой памяти.

Пример рабочего процесса: Исследовательский проект с несколькими AI

Реалистичный рабочий процесс, показывающий MARM в действии. Сценарий: вы исследуете шаблоны аутентификации для нового проекта, используя несколько AI-клиентов.

Фаза 1: Маршрутная сессия (Claude)

You: "Claude, create a MARM session called 'auth-research-2025-01'"
Claude calls: marm_log_entry(entry="Session: auth-research")
Result: Session routed to auth-research-[today]. MARM lifecycle/docs initialize automatically.

Фаза 2: Сбор исследований (Claude)

You: "Summarize OAuth2 vs JWT for API authentication and save it"
Claude calls: marm_log_entry(entry="Research: OAuth2 is token-based with refresh cycles, better for delegated access. JWT is stateless, good for microservices...", session_name="auth-research-2025-01")
Result: Research captured in the active session log and marked for summary-cache refresh

Фаза 3: Добавить повторно используемую ссылку (Claude)

You: "Save a JWT validation code snippet to my notebooks as 'jwt-validation-pattern'"
Claude calls: marm_notebook(action="add", name="jwt-validation-pattern", data="def verify_jwt(token):\n  # validation logic...")
Result: Reusable snippet stored for future projects

Фаза 4: Вспомнить контекст (Gemini)

You: "Gemini, what authentication approaches did we research? Activate the JWT pattern."
Gemini calls: marm_smart_recall("authentication patterns", search_all=True)
Gemini calls: marm_notebook(action="use", names="jwt-validation-pattern")
Result: Gemini sees previous research + has JWT code available as context

Фаза 5: Синтез и сводка (Qwen)

You: "Qwen, pull everything from the auth research and create a summary"
Qwen calls: marm_smart_recall("authentication", session_name="auth-research-2025-01", limit=20)
Qwen calls: marm_summary(session_name="auth-research-2025-01")
Result: Qwen generates an implementation guide from all captured research

Фаза 6: Завершить сессию (Claude)

You: "Log final decision - we're using JWT for APIs, and OAuth2 for user auth"
Claude calls: marm_log_entry(entry="DECISION: JWT for API auth, OAuth2 for user flows. Rationale: stateless APIs + delegated user access", session_name="auth-research-2025-01")
Result: Decision logged and searchable by all future AI clients

Результат: Три разных AI-клиента совместно исследовали тему, обменивались идеями и документировали решения. И все это без повторного объяснения проекта каждому новому AI.

Продвинутые шаблоны

Project Structure:
├── project-name-planning/          # Initial design and requirements
├── project-name-development/       # Implementation details
├── project-name-testing/           # QA and debugging notes
├── project-name-deployment/        # Production deployment
└── project-name-retrospective/     # Lessons learned

Цикл базы знаний:

  1. Захват: Используйте marm_log_entry для структурированных обучающих сессий

  2. Организация: Создавайте тематические сессии для областей знаний

  3. Синтез: Регулярно используйте marm_summary для консолидации знаний

  4. Применение: Преобразуйте сводки в записи marm_notebook(action="add", ...)

Совместная работа нескольких AI: каждый AI работает в выделенных сессиях по своим сильным сторонам, использует marm_smart_recall для развития работы других, а затем совместная сессия объединяет полученные знания.

  • Именование сессий: Включайте имя LLM для перекрестных ссылок

  • Стратегическое логирование: Сосредоточьтесь на ключевых решениях, решениях проблем, открытиях, конфигурациях

  • Глобальный поиск: Используйте search_all=True для поиска по всем сессиям

  • Поиск на естественном языке: "проблемы аутентификации с JWT токенами" лучше, чем "ошибка аутентификации"

  • Многоуровневая глубина извлечения: detail=1 возвращает краткое представление (~200 символов), detail=2 — более широкий контекст (~500 символов), detail=3 — полное содержимое памяти

  • Стекирование записной книжки: Объединяйте несколько записей для сложных рабочих процессов

  • Компактизация: Позвольте MARM выявлять кандидатов на компактизацию, затем используйте marm_compaction для подготовки, просмотра, применения или отклонения сводок

  • Жизненный цикл сессии: Начало → Работа → Ссылка → Просмотр подготовленной компактизации, когда MARM запрашивает

Понимание памяти MARM

Два поиска, две очень разные проблемы, один инструмент:

User: "I discussed machine learning algorithms yesterday"
MARM Search: Finds related memories about "ML models", "neural networks", "AI training"

User: "What was the COMPACTION_TRIGGER_COUNT setting?"
MARM Search: Finds the exact config memory even if the rest of the text differs

Первый запрос касается смысла, поэтому MARM переранжирует кандидатов с помощью локальных векторных эмбеддингов — семантический поиск в стиле RAG без размещенной векторной базы данных. Второй имеет синтаксическую форму (ключ конфигурации), поэтому MARM автоматически обнаруживает это и направляет его через детерминированное точное сопоставление. Этот канал точного извлечения — разница между системой памяти, которая работает в демонстрациях, и той, которая отвечает на вопросы, которые разработчики действительно задают: ключи конфигурации, флаги CLI, пути к файлам, имена API, строки ошибок. Чисто семантические системы памяти терпят неудачу именно на таких запросах.

MARM использует гибридное извлечение фильтр→переранжирование плюс канал точного извлечения:

  1. Точный канал (exact_mode="auto", по умолчанию): ключи конфигурации, флаги CLI, пути к файлам, имена API/инструментов, точечные пространства имен, HTTP-маршруты, URL и строки команд в кавычках обнаруживаются и направляются через детерминированный FTS5 BM25 с запасным вариантом LIKE. Эмбеддинги не используются, поэтому результаты стабильны и буквальны.

  2. Канал фильтр→переранжирование: запросы на естественном языке сначала извлекают ограниченный набор кандидатов из индекса FTS (FTS_CANDIDATE_LIMIT, по умолчанию 200), затем семантические эмбеддинги переранжируют этих кандидатов по смыслу. Консервативное временное взвешивание дает более свежим воспоминаниям небольшое преимущество, когда совпадения в остальном близки.

  3. Ограниченный семантический запасной вариант: когда покрытие FTS слабое или непригодно, MARM переключается на ограниченное семантическое сканирование (RECALL_SCAN_LIMIT). Если ответ включает recall_scan_truncated=true, запасной вариант достиг своего предела; сузьте сессию/запрос или увеличьте переменную окружения для больших хранилищ.

  4. Оценка с учетом чанков: длинные воспоминания (примерно 180+ слов) внутренне разбиваются на перекрывающиеся строки чанков, и при извлечении оценки чанков сворачиваются обратно в одно родительское воспоминание с использованием наилучшего совпадающего чанка. Как канал переранжирования, так и запасной канал учитывают чанки.

Вот почему задержка извлечения остается почти постоянной по мере роста хранилища (см. бенчмарки): семантическое переранжирование всегда оценивает ограниченный набор вместо сканирования каждого эмбеддинга.

Управление точным извлечением: exact_mode="auto" обычно правильный. Используйте exact_mode="exact", когда запрос должен соответствовать буквальному тексту, например RECALL_SCAN_LIMIT, --generate-key или settings.py. Используйте exact_mode="semantic", когда запрос, похожий на синтаксический, все равно должен обрабатываться как извлечение на основе смысла.

Типы памяти и классификация

  1. Context Logs - Автоматически классифицированные воспоминания разговоров

  2. Manual Entries - Явно сохраненная важная информация

  3. Notebook Entries - Повторно используемые инструкции и знания

  4. Session Summaries - Сжатая история разговоров

MARM автоматически категоризирует содержимое при записи: Код (фрагменты кода и технические обсуждения), Проект (рабочие разговоры и планирование), Книга (литература, учебные материалы, исследования) и Общее (все остальное).

Атрибуция проекта и платформы

MARM хранит допускающие NULL столбцы project и platform в воспоминаниях, записях журнала и записях записной книжки. Проект определяется из рабочего каталога, а платформа — из подключающегося клиента (Claude Code, VS Code, Cursor, ...); MARM_PROJECT и MARM_PLATFORM переопределяют обнаружение. marm_smart_recall(project=..., platform=...) ограничивает извлечение, не изменяя поведение по умолчанию без фильтрации, поэтому один общий сервер может содержать несколько проектов без перекрестного загрязнения.

Графы знаний: Код и концепции

MARM поставляется с двумя системами графов, которые дополняют хранилище памяти: граф кода, который понимает структуру вашего репозитория, и граф концепций, который понимает, о чем ваши сохраненные воспоминания. Когда оба индексированы для одного проекта, сущности концепций перекрестно ссылаются на символы кода.

Граф кода: индексация репозитория и поиск кода

marm-graph встроен в оба транспорта. Он индексирует репозиторий один раз, а затем позволяет агентам задавать вопросы о структуре кода без повторного сканирования файлов:

Use marm_graph_index to index this repository.
Then use marm_code_lookup when you need symbols, files, or source snippets.
Use marm_graph_trace for call paths, marm_graph_architecture for an overview, and marm_graph_impact for change-risk checks.

Рекомендуемый рабочий процесс агента: индексировать один раз, затем marm_code_lookup перед широким чтением файлов, marm_graph_trace, когда важен контекст вызывающих/вызываемых или поток данных, marm_graph_architecture для ориентации и marm_graph_impact перед рискованными рефакторингами. Один запрос к графу заменяет десятки циклов grep/чтения, откуда и берется экономия токенов.

После индексации репозитория MARM поддерживает его актуальность самостоятельно. Фоновый опросчик замечает, когда репозиторий изменился, и переиндексирует его, поэтому нет необходимости переиндексировать вручную после коммита. Пока у вас есть незакоммиченная работа, он обновляется каждый цикл, поскольку никакая дешевая проверка не может увидеть повторные правки в уже измененном файле. Чтобы индексировать только по запросу:

marm-mcp-server projects auto off

Агент может сделать то же самое с помощью marm_graph_index(action="auto_off"), а action="auto_status" сообщает, что отслеживается и когда каждый проект был последний раз проиндексирован. Переключатель сохраняется между перезапусками и переопределяет переменную окружения GRAPH_AUTO_INDEX.

Под капотом движок — codebase-memory-mcp (MIT), статический бинарник без зависимостей, который анализирует 158 языков через tree-sitter с гибридным разрешением типов LSP для основных, индексирует средний репозиторий за секунды и отвечает на поиск символов и трассировку вызовов значительно быстрее секунды. Измерено на графе из 149 107 узлов через постоянное соединение, которое поддерживает MARM: поиск символов 146 мс, трассировка вызовов 67 мс, а полный обзор архитектуры 1,23 с — это единственный запрос, который не укладывается в секунду. MARM фиксирует конкретный релиз, проверяет его схему инструментов при запуске и направляет набор инструментов вышестоящего уровня через 5 сфокусированных MCP-инструментов, чтобы поверхность модели оставалась небольшой. Графовый бэкенд запускается лениво при первом использовании графового инструмента, поэтому инструменты памяти, журналирования, записной книжки и сводок по-прежнему запускаются быстро. В Docker бинарник движка встроен в образ; локальные pip-установки загружают его при первом использовании графа (~269 МБ, однократно).

Режим пониженной функциональности: если графовый движок не запускается (нет сети для первой загрузки, диск заполнен, расхождение схемы) или установлено GRAPH_ENABLED=false, графовые инструменты возвращают {"status": "error", "message": "graph backend unavailable"}, в то время как остальные 9 инструментов продолжают работать нормально. Сбои графа никогда не могут вывести из строя память.

Граф концепций: о чем ваши воспоминания

MARM извлекает граф знаний из сохраняемых вами воспоминаний, создавая типизированные сущности (концепции, решения, шаблоны, ошибки, инструменты, люди, организации), связанные типизированными отношениями (исправляет, реализует, зависит_от, использует, вызывает, заменяет, расширяет). Это происходит автоматически: сохранение воспоминания ставит его в очередь, и фоновый рабочий процесс добавляет его в граф примерно через 30 секунд. marm_concept_build по-прежнему доступен для полной или ограниченной перестройки. Как только граф существует, marm_smart_recall добавляет ограниченные связанные сущности, отношения и связанный код в качестве дополнительного graph_context, не изменяя основной рейтинг памяти. marm_concept_recall остается доступным для явного исследования графа:

marm_concept_recall(query="write queue")            → the entity, its relationships, linked code symbols
marm_concept_recall(query="related to SQLite", depth=3) → multi-hop traversal of everything connected

Как это использовать:

  • Автоматически по умолчанию: новые воспоминания попадают в граф без вызова инструмента. Установите CONCEPT_AUTO_INDEX=false, чтобы вернуться только к ручной сборке — это останавливает воркер, но продолжает записывать строки очереди, так что при повторном включении подхватывается всё, что было записано, пока она была выключена; CONCEPT_INDEX_DEBOUNCE_SECONDS (30) и CONCEPT_INDEX_BATCH_SIZE (20) управляют темпом.

  • Безопасно на обоих транспортах одновременно: арендованная блокировка в базе данных памяти предотвращает ситуацию, когда перестройка в одном процессе удаляет таблицы графа, пока другой процесс пишет в них. Сборка, обнаружившая, что граф занят, сообщает об этом вместо коллизии.

  • Сбой никогда не достигает ваших воспоминаний: индексация выполняется в надёжной очереди вне пути записи. Проблемы с извлечением повторяются, воспоминание, которое многократно выходит из строя, помещается с ошибкой, а само воспоминание хранится и извлекается как обычно всё это время.

  • Очистка отставания стоит некоторой скорости извлечения: извлечение сущностей требует ресурсов ЦП, поэтому, пока воркер обрабатывает очередь, измеренное время извлечения увеличивается с ~8 мс до ~16 мс медианного на реальном корпусе из 768 воспоминаний. Записи не затрагиваются. Это действует только пока отставание устраняется, что для большинства происходит один раз, после перестройки при обновлении. Воспроизведите с помощью scripts/benchmarking/performance/bench_concept_worker.py --from-live.

  • Сборка для отставания: marm_concept_build с областью session_name, project или search_all=True индексирует воспоминания, сохранённые до появления автоматической индексации, и перестраивает после обновления, требующего этого.

  • На данный момент два обновления: графы, построенные до атрибуции платформы или до того, как источники компактизации заменили сводки в качестве индексируемых строк, требуют marm_concept_build(search_all=True). Полная сборка создаёт резервную копию и сбрасывает только производную базу данных концептов; целевые сборки отказываются угадывать владение платформой.

  • Вся область, постранично: сборки читают каждое воспоминание в области. CONCEPT_BUILD_ROW_CAP (по умолчанию 500) — размер страницы, так что его уменьшение заставляет сборку читать больше, меньших страниц, а не пропускать остальное.

  • Компактизированные сессии: исходные воспоминания индексируются, а сгенерированная сводка — нет, поэтому концепты остаются привязанными к тому, где они были фактически высказаны.

  • Извлечение работает с отказоустойчивостью: отсутствующий, пустой, несовместимый или недоступный граф концептов никогда не блокирует нормальное извлечение воспоминаний. Ответ сообщает статус графа отдельно.

  • Перекрёстные ссылки кода: когда граф кода проиндексировал тот же проект, сущности концептов, совпадающие с символами кода, связываются, соединяя «что мы решили» с «где это находится в коде».

  • Встроенная среда выполнения извлечения: среда выполнения spaCy и модель извлечения для английского языка поставляются с MARM, но загружаются только при первом извлечении, которое теперь происходит само по себе вскоре после сохранения первого воспоминания, а не при запуске сборки. Если повреждённая или частичная установка делает их недоступными, оба инструмента концептов корректно деградируют, в то время как основная память остаётся доступной; выполните marm-memory knowledge status, затем переустановите MARM, если необходимо.

  • Изолированное хранилище: граф концептов находится в собственной базе данных SQLite (~/.marm/index/marm_index.db) с собственным пулом соединений, поэтому записи графа концептов никогда не могут заблокировать или повредить производственную базу данных памяти.

  • Консольный атлас: MARM Console отображает полный атлас до 750 сущностей и 6000 сохранённых связей. Для более крупных графов используется детерминированная связная выборка до 600 сущностей и 4000 агрегированных визуальных рёбер, чётко помеченная как выборка.

Это заполняет пробел в структуре между сессиями, который оставляет плоский поиск по памяти: сессии организуют воспоминания, но граф концептов связывает их, так что на вопрос «что зависит от очереди записи?» можно ответить, даже если ответ охватывает пять сессий от трёх разных агентов.

Архитектура и внутреннее устройство

Всё вышеперечисленное работает на небольшом наборе продуманных механизмов. Этот раздел — полная карта, чтобы вам (или вашему агенту) никогда не приходилось гадать, что делает сервер.

Движок хранения

  • SQLite в режиме WAL по адресу ~/.marm/marm_memory.db с пулом соединений (5 соединений). WAL предотвращает блокировку читателей во время записи, что важно, когда несколько агентов извлекают, пока один пишет.

  • Полнотекстовый индекс FTS5 (memories_fts) поддерживается как таблица внешнего содержимого поверх таблицы воспоминаний и обеспечивает как точный путь (BM25), так и этап фильтрации гибридного извлечения.

  • Хранение фрагментов: воспоминания длиной более ~180 слов разбиваются на перекрывающиеся фрагменты по 150 токенов (перекрытие 50 токенов) в таблице memory_chunks, каждый со своим встраиванием. Извлечение оценивает фрагменты и сворачивает в родительское воспоминание.

  • Встраивания создаются кодировщиком jinaai/jina-embeddings-v2-small-en на основе fastembed: 33M параметров, 512 измерений, контекстное окно в 8192 токенов и лицензия Apache-2.0. Он не требует отдельных префиксов текста запроса/документа. Кодировщик лениво загружается при первом семантическом использовании и сериализуется под блокировкой, чтобы параллельные кодировки не могли повредить друг друга. Если он недоступен, записи всё равно успешны; воспоминания сохраняются без встраиваний до его загрузки. Семантическая оценка выполняется как один пакет NumPy (матричный косинус), а не как цикл Python.

  • Граф концептов имеет собственную базу данных (~/.marm/index/marm_index.db) и собственный пул, используя ту же реализацию пула, но никогда не разделяя соединения с хранилищем памяти. Преднамеренная изоляция: экспериментальная сборка графа не должна иметь возможности заблокировать производственный WAL. Единственное исключение — очередь индексации, которая намеренно находится в базе данных памяти, чтобы воспоминание и его задача индексации фиксировались вместе; сам граф остаётся производным и одноразовым.

Путь записи

  • Сериализованная очередь записи (включена по умолчанию): все записи воспоминаний проходят через одного внутреннего асинхронного воркера, устраняя конкуренцию писателей SQLite при многопользовательской нагрузке. Очередь универсальна; операции компактизации проходят через того же воркера, так что есть ровно один писатель независимо от того, какая подсистема пишет. MAX_QUEUE_SIZE ограничивает её.

  • Консолидация во время записи (опционально, CONSOLIDATION_ENABLED=1) выполняется в два слоя до того, как воспоминание попадает в хранилище:

    • Слой 1, точная дедупликация: хеш SHA-256 нормализованного содержимого проверяется в рамках сессии; совпадения хешей проверяются на фактическое содержимое перед дедупликацией, так что коллизия хешей сохраняет новую строку вместо бесшумного слияния разного содержимого.

    • Слой 2, семантическое слияние: почти дубликаты с косинусным сходством выше CONSOLIDATION_THRESHOLD сливаются, а не накапливаются. Это никогда не блокирует запись; если кодировщик недоступен, запись продолжается без консолидации.

    • Компромисс измерен и опубликован: примерно 9-кратная медианная стоимость записи (58 мс против 6,5 мс) в обмен на чистое хранилище, поскольку чтения доминируют в рабочих нагрузках памяти. См. раздел 3 бенчмарков выше.

  • Индексация концептов — это надёжный исходящий ящик: запись фиксирует задачу индексации в той же транзакции, что и воспоминание, поэтому воспоминание не может существовать без неё. Фоновый воркер обрабатывает эту очередь и записывает граф концептов. Ничто на пути записи не ждёт извлечения, и процесс, прерванный во время извлечения, не теряет работу, поскольку задача является строкой, а не задачей в памяти. Оба транспорта запускают воркер, поэтому они координируются через арендованную блокировку в базе данных памяти, а не через внутрипроцессную блокировку, которая не могла бы охватить их.

  • Компактизация (опционально, COMPACTION_ENABLED=1) — это Слой 3: после достаточного количества записей в сессии фоновый проход обнаруживает кластеры связанных воспоминаний с использованием косинусного сходства и объединения-поиска связных компонентов, с порогом минимального размера кластера, минимальным возрастом и периодом ожидания активной сессии, чтобы он никогда не компактизировал выполняемую работу. Затем MARM вставляет ограниченный запрос, предлагая подключённому агенту обобщить каждый кластер: candidatesstagereviewapply или discard. Идентификаторы исходных воспоминаний сохраняются при применении, поэтому компактизированные сводки остаются отслеживаемыми до оригиналов. Поставленные сводки истекают (COMPACTION_STAGING_TTL_HOURS), напоминания ограничены по количеству и охлаждению, а вставка имеет бюджет байтов. Дизайн честен в отношении того, для чего нужны LLM: MARM обнаруживает, агент обобщает, а цикл stage/apply/discard, доступный для проверки человеком, управляет деструктивным шагом.

Путь извлечения

Рассмотрено в разделе Понимание памяти MARM: точный путь (FTS5 BM25 + запасной LIKE), фильтр→переранжирование (ограниченные кандидаты FTS → пакетное семантическое переранжирование → временное смешивание), ограниченный семантический запасной вариант с явным флагом усечения и оценка свёртки фрагментов. Глубина извлечения (detail=1/2/3) контролирует, сколько каждого воспоминания возвращается, и каждый ответ MCP проходит через ограничитель ответа в 1 МБ, который интеллектуально усекает содержимое вместо нарушения протокола.

Протокол подпроцесса графа кода

Встроенный движок графа работает как контролируемый дочерний процесс, а не как импорт:

  • Транспорт: JSON-RPC 2.0 с разделителями строк через stdio дочернего процесса, с проверенным рукопожатием (initialize → захват версии сервера → initialized notification).

  • Осторожность с конвертами: ответы сканируются на первый элемент содержимого, который можно разобрать как JSON, а не предполагается индекс 0, потому что вышестоящий двоичный файл может добавить уведомление об обновлении. Ошибки инструментов приходят как result.isError, а не как ошибки JSON-RPC, и преобразуются в чистые словари {"status": "error"} с прикреплённой подсказкой по исправлению от вышестоящего.

  • Сериализация: одна блокировка защищает каждый цикл записи+чтения на единственном канале stdin; асинхронные вызывающие идут через asyncio.to_thread, чтобы цикл событий никогда не блокировался на вводе-выводе подпроцесса.

  • Восстановление после сбоя: stderr обрабатывается в фоновом потоке, обнаруживается EOF/сбой дочернего процесса, и процесс прозрачно перезапускается при следующем вызове. Тайм-ауты намеренно не рассматриваются как сбои; длительный запуск индексации может всё ещё работать, и его прерывание уничтожило бы выполняемую работу.

  • Наблюдение: ленивый синглтон-супервизор владеет клиентом на время жизни процесса. Запуск инициируется первым вызовом инструмента графа или опросчиком автоматической индексации, если двоичный файл движка уже загружен, никогда не вызывает исключение в слой MCP и проверяет схему инструментов закреплённого двоичного файла, чтобы дрейф вышестоящего был обнаружен при запуске, а не во время вызова.

  • Автоматическая переиндексация опрашивается по сигнатуре git, а не отслеживается файловая система: фоновая задача сравнивает HEAD и грязное состояние каждого проиндексированного репозитория, вычисляемое запуском git вне движка, чтобы проверка бездействия не стоила блокировки движка. Коммит инициирует переиндексацию. Пока дерево грязное, репозиторий переиндексируется каждый цикл, потому что git status сообщает, какие файлы изменились, а не что в них содержится, поэтому повторные правки одного уже изменённого файла дают байт-идентичный вывод, который не может отличить никакая более дешёвая сигнатура. Git запускается с отключённым core.fsmonitor и очищенным окружением, поскольку эта настройка называет программу, которую git в противном случае выполнял бы из отслеживаемого репозитория по таймеру.

  • Один шлюз для каждой мутации хранилища: ручные индексы на всех трёх поверхностях, опросчик и удаление проекта проходят через одну арендованную строку в базе данных памяти. HTTP и STDIO — это отдельные процессы с отдельными дочерними движками, использующими одно общее хранилище движка, поэтому внутрипроцессная блокировка не может охватить их. Аренда освобождается, когда вызов движка фактически возвращается, а не когда его вызывающий прекращает ожидание: отменённый запрос не может передать хранилище другому процессу, пока движок всё ещё пишет в него.

Безопасность и ограничение скорости

  • Двухрежимный шлюз аутентификации: без ключа на loopback (127.0.0.1), MARM_API_KEY (Bearer) обязателен, как только сервер становится сетевым (SERVER_HOST=0.0.0.0, Docker). --generate-key создаёт его. Безопасно по умолчанию, нулевое трение настройки локально.

  • IP-базированное ограничение скорости с скользящими окнами и временными блокировками, настраивается через пресеты CLI, а не через лабиринт конфигурации (таблица ниже).

  • Локально-ориентированное: всё находится в ~/.marm/; нет облачной синхронизации, нет телеметрии, нет внешнего хранилища.

  • Корректное завершение: обработчики SIGTERM/SIGINT очищают и закрывают пул соединений, а внутренняя система событий запускает обратные вызовы автоматизации с изоляцией ошибок для каждого обратного вызова и тайм-аутами, чтобы один плохой хук не мог заблокировать сервер.

Пресеты для роя и мультиагентных систем

Флаг

Лимит запросов

Очередь записи

Когда использовать

(нет)

80 RPM

включена

Обычное локальное использование и небольшие конфигурации из 3-5 агентов

--swarm

200 RPM

включена

Общий HTTP-сервер, примерно 15-30 агентов в зависимости от стиля записи

--swarm-max

600 RPM

включена

Более тяжелый локальный/частный рой, примерно 50-100 агентов в зависимости от стиля записи

--trusted

отключен

включена

Только для частных/доверенных развертываний

--rate-limit-rpm N

N RPM

без изменений

Пользовательская настройка; 0 отключает ограничение

Очередь записи сериализует записи в память независимо от пресета; флаги роя настраивают поверх этого лимит HTTP-запросов. Очередь управляет порядком записи; консолидация и уплотнение являются отдельными уровнями обслуживания памяти. Этот стек (WAL + пулинг + один сериализованный писатель + пресеты RPM) намеренно ограничен сценарием «SQLite, много агентов, одна машина»; распределенная многопоточная память выходит за рамки текущей архитектуры.

Самоподдерживающаяся документация

Встроенные документы индексируются в пространство памяти marm_system при запуске и обновляются каждые 50 вызовов инструментов, с отслеживанием хэша исходного файла, чтобы неизмененные документы пропускались, а измененные или удаленные строки переиндексировались. Подключенные агенты могут отвечать на вопросы об использовании MARM с помощью marm_smart_recall вместо того, чтобы вы вставляли им документацию.

Справочник по конфигурации

Переменная

По умолчанию

Что контролирует

SERVER_HOST

127.0.0.1

Адрес привязки; 0.0.0.0 открывает сервер для сети и делает MARM_API_KEY обязательным

SERVER_PORT

8001

HTTP-порт

MARM_API_KEY

(пусто)

Bearer-ключ для развертываний, доступных из сети

MARM_DB_PATH

~/.marm/marm_memory.db

Расположение базы данных памяти

MARM_CONCEPT_DB_PATH

~/.marm/index/marm_index.db

Расположение базы данных графа понятий

MARM_PROJECT / MARM_PLATFORM

(автоопределение)

Переопределение атрибуции проекта/платформы

MARM_RATE_LIMIT_RPM

80

Запросов в минуту на IP (предустановки переопределяют)

WRITE_QUEUE_ENABLED

1

Сериализация записи через один рабочий процесс

FTS_CANDIDATE_LIMIT

200

Кандидаты BM25, полученные до семантического переранжирования; увеличьте для хранилищ со слабым совпадением по ключевым словам, уменьшите для сужения результатов до наиболее близких совпадений по ключевым словам

RECALL_SCAN_LIMIT

10000

Ограничение на семантическое сканирование запасного варианта; recall_scan_truncated=true в ответах означает, что оно было достигнуто

FTS_QUERY_MODE

or_nostop

Как семантический поиск строит запрос по ключевым словам: or_nostop игнорирует слова-паразиты, затем сопоставляет любой оставшийся термин, or сопоставляет любой термин, and требует каждый термин (поведение до версии 2.31.0). Точный/лексический канал всегда требует каждый термин.

FTS_EXTRA_STOPWORDS

(пусто)

Дополнительные слова, разделенные запятыми, для игнорирования при построении запросов по ключевым словам, для терминов, настолько распространенных в вашем хранилище, что они не несут сигнала

HYBRID_SEARCH_TEXT_WEIGHT

0.05

Насколько оценка по ключевым словам влияет на ранжирование. Установлено на основе прогона бенчмарков; точность достигает пика в диапазоне 0.04-0.08 и резко падает выше 0.10. При 0.0 сопоставление по ключевым словам сужает круг рассматриваемых воспоминаний, но не меняет их порядок.

FTS_LONE_HIT_SCORE

1.0

Оценка по ключевым словам, используемая, когда совпадает только одно воспоминание или когда все совпадения имеют одинаковую оценку. Уменьшите в небольших хранилищах, если одно совпадение по ключевому слову не должно считаться идеальным.

SEMANTIC_SEARCH_ENABLED

1

Установите в 0, чтобы запустить без модели эмбеддингов: ничего не загружается, эмбеддинги не записываются, а поиск переключается на сопоставление по ключевым словам. Полезно на хостах с малым объемом памяти или чтобы увидеть, как ведет себя поиск, когда модель недоступна. marm-memory doctor сообщает, когда эта опция выключена.

TEMPORAL_WEIGHT / TEMPORAL_HALF_LIFE_DAYS

0.1 / 30

Сила и скорость затухания повышения за свежесть

CONSOLIDATION_ENABLED

0

Дедупликация + семантическое слияние во время записи

CONSOLIDATION_THRESHOLD

0.92

Косинусное сходство, необходимое для слияния почти дубликатов. Сравнивается только со смысловым сходством, а не со смешанной оценкой ранжирования

COMPACTION_ENABLED

0

Фоновое обнаружение кластеров + уплотнение с помощью агента

COMPACTION_TRIGGER_COUNT

5

Количество записей за сессию перед проходом уплотнения

COMPACTION_SIMILARITY_THRESHOLD / COMPACTION_MIN_CLUSTER_SIZE / COMPACTION_MIN_AGE_HOURS

0.88 / 3 / 24

Пороги обнаружения кластеров

COMPACTION_STAGING_TTL_HOURS

168

Как долго промежуточные сводки ожидают перед истечением

GRAPH_ENABLED

true

Аварийный выключатель для 5 инструментов графа кода

GRAPH_AUTO_INDEX

true

Автоматическое переиндексирование репозиториев, уже находящихся в графе кода. Сохраненный переключатель от projects auto off или marm_graph_index(action="auto_off") переопределяет это, поэтому значение, установленное здесь, не может повторно включить то, что отключил пользователь

GRAPH_AUTO_INDEX_INTERVAL

30

Секунд между проверками git-сигнатур для каждого репозитория. Минимум 5

GRAPH_AUTO_INDEX_FULL_INTERVAL

300

Секунд между переиндексациями для каталога, который не является git-репозиторием, где нет дешевой проверки изменений. Минимум 60

GRAPH_AUTO_INDEX_MODE

moderate

Глубина индексации для автоматических переиндексаций: full, moderate или fast. Любое другое значение вызывает предупреждение и возврат к запасному варианту

GRAPH_AUTO_INDEX_LEASE_SECONDS

120

Как долго шлюз индексации остается занятым, когда его никто не продлевает. Запущенная индексация продлевает свою собственную аренду, поэтому это ограничивает время, в течение которого убитый процесс блокирует индексацию, а не то, сколько времени может занять сама индексация

GRAPH_AUTO_INDEX_PROJECT_TTL

300

Как долго список отслеживаемых проектов считается достоверным, прежде чем он будет перечитан из движка

CONCEPT_BUILD_ROW_CAP

500

Количество строк памяти, читаемых за страницу во время построения графа понятий. Не является ограничением для построения: каждое воспоминание в области видимости читается в любом случае

CONCEPT_AUTO_INDEX

true

Автоматическое индексирование понятий для новых воспоминаний. false, 0, no или off останавливает рабочий процесс и оставляет построение ручным. Записи все равно записывают строки очереди в любом случае

CONCEPT_INDEX_DEBOUNCE_SECONDS

30

Период тишины после записи перед началом индексации, чтобы всплеск стал одним проходом

CONCEPT_INDEX_BATCH_SIZE

20

Воспоминания, индексируемые за пакет, максимум 500. Уменьшение не снижает конкуренцию; по измерениям, это немного ухудшает ситуацию

CONCEPT_INDEX_BATCH_PAUSE_MS

250

Пауза между пакетами при очистке отставания. Сокращает время поиска в наихудшем случае во время индексации с ~270 мс до ~80 мс при примерно на 18% более длительном времени обработки. 0 отключает это

CONCEPT_INDEX_LEASE_SECONDS

300

Как долго заявленная задача индексации остается занятой, когда ее никто не продлевает. Выполняемая работа продлевает свою собственную аренду, поэтому это ограничивает время, в течение которого убитый процесс удерживает задачи, а не то, сколько времени может занять пакет. Возвращенные задачи не тратят попыток

CONCEPT_INDEX_MAX_ATTEMPTS

3

Количество неудачных попыток, прежде чем воспоминание будет отложено с его ошибкой вместо повторной попытки

Устранение неполадок

По умолчанию Jina v2 Small использует 512-мерные эмбеддинги; старые данные all-MiniLM-L6-v2 имеют размерность 384 и должны быть переэмбеддированы. Остановите все процессы MARM HTTP и STDIO, затем выполните:

marm-memory maintenance embeddings migrate

Это переэмбеддирует векторы памяти, чанков и существующие векторы графа понятий (записи в блокноте больше не содержат эмбеддинги), сообщает о прогрессе, проверяет обе базы данных и может быть возобновлено после прерывания. Команда отказывается запускаться, если запущен HTTP-сервер; процессы STDIO не могут быть надежно обнаружены, поэтому их необходимо остановить вручную.

Восстановление чанкированных воспоминаний

Воспоминания длиннее 500 слов также хранятся в виде более мелких чанков. Размеры чанков менялись в разных версиях, и описанная выше миграция переэмбеддирует чанки без их повторного разделения, поэтому старые чанки сохраняют устаревшие границы. Остановите все процессы MARM, затем выполните:

marm-memory maintenance chunks rechunk

Эта команда повторно разделяет устаревшие чанки, заполняет те, что были потеряны из-за прерванной записи, и удаляет чанки из воспоминаний, которые теперь не превышают порог. Воспоминания, которые уже корректны, пропускаются без загрузки кодировщика, поэтому повторный запуск ничего не стоит. Та же защита от работающего сервера, что и выше, плюс отказ, если сохраненные векторы не соответствуют настроенной модели эмбеддинга: в этом случае сначала выполните миграцию. Восстановление работает и без этого, просто менее точно для длинных воспоминаний.

Сервер не запускается

  • Проверьте версию Python: python --version (должна быть 3.10+)

  • Убедитесь, что порт 8001 не занят: lsof -i :8001 (macOS/Linux) или netstat -ano | findstr :8001 (Windows)

  • Проверьте ошибки прав доступа в домашней директории (~/.marm/ должна быть доступна для чтения и записи)

  • См. устранение неполадок для конкретной платформы: INSTALL-DOCKER.md, INSTALL-WINDOWS.md, INSTALL-MACOS.md, INSTALL-LINUX.md

STDIO-подключение не работает

  • Убедитесь, что marm-mcp-stdio находится в вашем PATH после pip install: marm-mcp-stdio --help

  • Альтернативно используйте: python -m marm_mcp_server.server_stdio

  • Проверьте документацию ИИ-клиента на предмет требований к транспорту STDIO

  • Попробуйте прямой запуск для просмотра сообщений об ошибках: python -m marm_mcp_server.server_stdio

ИИ-клиент не может подключиться к MARM

  • Убедитесь, что сервер запущен с помощью curl http://localhost:8001/health

  • Проверьте, не блокирует ли брандмауэр порт 8001

  • Для STDIO: используйте marm-mcp-stdio (консольный скрипт) или python -m marm_mcp_server.server_stdio

  • Перезапустите сервер и ИИ-клиент

Инструменты не отображаются в ИИ-клиенте

  • Проверьте HTTP-режим с помощью curl http://localhost:8001/health

  • Проверьте журналы сервера на наличие ошибок инициализации

  • Отключите и снова подключите ИИ-клиент, чтобы обновить список инструментов

  • И HTTP, и STDIO предоставляют 14 инструментов: 7 основных инструментов для памяти/логирования/блокнота/компактации, 5 встроенных инструментов для графа кода и 2 инструмента для графа понятий

Инструменты графа возвращают graph backend unavailable

  • Убедитесь, что GRAPH_ENABLED не установлен в false (влияет как на HTTP, так и на STDIO; инструменты графа полностью одинаковы для обоих транспортов)

  • Первое использование графа может занять больше времени, пока запускается закрепленный движок базы кода или пока он загружается локально

  • В Docker бинарный файл движка графа встроен в образ; локальные pip-установки могут загружать его при первом использовании графа

  • Основные инструменты памяти продолжают работать, даже если запуск графа завершился неудачей

Инструменты понятий возвращают entities_extracted: 0

  • Сначала убедитесь, что сборка понятий с областью видимости действительно включает воспоминания с извлекаемыми сущностями.

  • Выполните marm-memory knowledge status; если он сообщает об отсутствии среды выполнения или модели, исправьте установку с помощью python -m pip install -U --force-reinstall marm-mcp-server.

Новые воспоминания не отображаются в графе

  • Выполните marm-memory knowledge status. index_queue.pending — сколько воспоминаний ожидает; index_queue.parked — сколько было отложено. auto_index: false означает, что индексация отключена.

  • Дайте время на интервал дебаунса (по умолчанию 30 секунд) плюс время извлечения. Пакет записей индексируется за один проход, а не по одному воспоминанию.

  • Проверьте, что CONCEPT_AUTO_INDEX не установлен в false, 0, no или off.

  • Граф, ожидающий перестроения, не индексируется. Если Консоль или marm-memory knowledge status сообщает rebuild_required, выполните marm_concept_build(search_all=True) один раз; ожидающие воспоминания будут подхвачены после этого.

  • Автоматическая индексация охватывает только воспоминания, записанные после обновления. Выполните сборку один раз, чтобы включить все более старые.

  • Воспоминание, которое не удалось извлечь три раза, помещается в очередь ожидания, а не повторяется бесконечно. Причина записывается вместе с задачей.

Изменения кода не отображаются в графе кода

  • Выполните marm-memory projects auto status. enabled: false означает, что автоматическая переиндексация отключена; source: override означает, что сохраненное переключение отключило ее, а не переменная окружения.

  • Репозиторий должен быть проиндексирован один раз, прежде чем за ним будет вестись наблюдение. marm-memory projects list показывает, что зарегистрировано.

  • Дайте время на интервал (по умолчанию 30 секунд) плюс время индексации. Коммит подхватывается при следующей проверке.

  • Проект, удаленный из Консоли, намеренно остается подавленным, чтобы устаревший список наблюдения не мог его воссоздать. Явная индексация повторно регистрирует его.

  • Автоматическая индексация требует движка графа, который остается неактивным до тех пор, пока не будет загружен бинарный файл движка. Любой вызов инструмента графа загружает его один раз.

Индекс возвращает index_in_progress

  • Другой процесс MARM удерживает шлюз индексации, обычно это опросчик другого транспорта или задание индексации в Консоли. Удаление проекта также сообщает об этом, поскольку удаление во время индексации было бы отменено. Повторите попытку через мгновение.

Сборка возвращает build_in_progress

  • Другой процесс MARM записывает граф, обычно это рабочий процесс индексации другого транспорта. Сборки короткие, если это не полная перестройка; повторите попытку через мгновение.

Сборка возвращает lock_lost

  • Сборка была приостановлена достаточно долго, чтобы другой процесс перехватил граф, поэтому она остановилась на полпути, а не записывала параллельно. Обычно это происходит из-за переведенного в спящий режим компьютера или паузы отладчика. Все, что было проиндексировано до остановки, сохраняется, и повторный запуск сборки завершает остальное.

Воспоминания не сохраняются

  • Убедитесь, что каталог ~/.marm/ существует и имеет права на запись

  • Проверьте доступное дисковое пространство

  • Протестируйте с простым воспоминанием: попросите ИИ сохранить одну строку и проверьте с помощью marm_log_show

  • Для HTTP-режима проверьте работоспособность сервера с помощью curl http://localhost:8001/health

Поиск не возвращает результатов

  • Убедитесь, что воспоминания существуют: используйте marm_log_show для просмотра записей

  • Используйте search_all=True для поиска по всем сессиям

  • Попробуйте более простые, более общие поисковые запросы

  • Подождите несколько секунд; первый семантический поиск загружает ML-модель

Воспоминания появляются, затем исчезают

  • Проверьте, не был ли MARM перезапущен или не произошел ли сбой (данные сохраняются в ~/.marm/)

  • Убедитесь, что дисковое пространство не заполнилось

  • Проверьте системные журналы на наличие ошибок базы данных

Потерянные или поврежденные данные

  • Немедленно остановите сервер

  • Проверьте каталог ~/.marm/ на наличие резервных копий (если вы их создавали)

  • Восстановите из резервной копии: скопируйте резервную копию ~/.marm/ обратно в домашнюю директорию

  • Перезапустите сервер

Ошибка блокировки базы данных

  • Закройте все подключения ИИ-клиентов

  • Остановите сервер: Ctrl+C

  • Сделайте резервную копию всего каталога базы данных: cp -r ~/.marm ~/.marm.backup

  • Проверьте процессы, удерживающие базу данных: lsof ~/.marm/marm_memory.db (macOS/Linux) или проверьте Диспетчер задач (Windows)

  • Если процесс удерживает блокировку, завершите его

  • Проверьте целостность базы данных: sqlite3 ~/.marm/marm_memory.db "PRAGMA integrity_check;"

  • Если проверка целостности не удалась, восстановите из резервной копии

  • Если проверка целостности пройдена, блокировка должна быть снята; перезапустите сервер

Медленные результаты поиска

  • Первый поиск медленнее (модель загружается с диска); последующие поиски быстрее

  • Большие базы данных (1000+ воспоминаний) могут занимать несколько секунд

  • Ограничьте поиск: используйте limit=10 вместо неограниченных результатов

  • Используйте marm_summary для сжатия старых сессий

Сервер использует слишком много памяти

  • Блокноты с большим количеством записей могут накапливаться; используйте marm_notebook(action="clear") для очистки активных записей

  • Закройте неиспользуемые подключения ИИ-клиентов

  • Используйте marm_compaction(action="review") для просмотра поэтапных сводок компактации, когда компактация включена

Ошибка

Причина

Решение

address already in use

Порт 8001 занят

Завершите процесс на 8001 или используйте другой порт

permission denied: ~/.marm/

Каталог базы данных недоступен для записи

chmod 755 ~/.marm/ или проверьте владельца

module not found: core.memory

Отсутствуют зависимости

Переустановите из marm-mcp-server/: pip install -e ".[dev]"

database is locked

Несколько процессов обращаются к БД

Закройте другие подключения, перезапустите сервер

embedding model not found

Модель семантического поиска не загрузилась

Первый запуск занимает время; наберитесь терпения, проверьте подключение к интернету

По вопросам поведения памяти, транспортов, поддерживаемых клиентов, компактации и резервного копирования см. FAQ.

История звёзд

Участие в разработке

MARM приветствует участников любого уровня. Код помогает, но также полезны документация, заметки по настройке, тестирование клиентов, отчёты об ошибках, бенчмарки и отзывы о реальных рабочих процессах от людей, ежедневно использующих ИИ-инструменты.

Хорошие места для помощи:

  • Тестируйте MARM с большим количеством MCP-клиентов, IDE-агентов и операционных систем

  • Улучшайте документацию, скриншоты, примеры и заметки по настройке для конкретных платформ

  • Сообщайте об ошибках или запутанных шагах установки с чёткими деталями воспроизведения

  • Делитесь рабочими процессами с памятью, привычками агентов и идеями инструментов из реального использования

  • Изучайте открытые issues

💡 Хотите увидеть своё имя в этом списке? Ознакомьтесь с нашим руководством CONTRIBUTING.md, чтобы начать!

Присоединяйтесь к сообществу MARM

Помогите построить будущее ИИ-памяти — программирование не требуется!

Связь: MARM Discord | GitHub Discussions

Лицензия и уведомление об использовании

Авторские права © 2026 Райан А. Лайелл. MARM распространяется под лицензией Apache 2.0 (см. NOTICE для заявления об авторских правах). Приветствуются форки, эксперименты и интеграции. MARM также включает сторонние компоненты с открытым исходным кодом, такие как codebase-memory-mcp под лицензией MIT; см. THIRD_PARTY_NOTICES.md для указания авторства. Если вы создаете что-то на его основе, пожалуйста, делайте неофициальные версии легко отличимыми от релизов, опубликованных официальным репозиторием MARM, чтобы пользователи знали, что они устанавливают.

Документация проекта

Руководства по использованию

  • README.md - Этот файл: полное руководство по использованию, справочник инструментов, рабочие процессы и архитектура

  • PROTOCOL.md - Протокол работы MCP

  • FAQ.md - Ответы на часто задаваемые вопросы об использовании MARM

Установка MCP-сервера

Информация о проекте

  • CONTRIBUTING.md - Как внести вклад в MARM

  • CHANGELOG.md - История версий и обновления

  • ACKNOWLEDGMENTS.md - Участники и благодарности

  • ROADMAP.md - Планируемые функции и дорожная карта разработки

  • LICENSE - Условия лицензии Apache 2.0

Available Tools

14 tools
marm_code_lookupA
🔎 Find code: symbols/definitions, text patterns, or a symbol's source.

Use INSTEAD OF grep/glob. `kind=auto` picks: a qualified_name reads source;
otherwise it searches the graph by name/keyword. Set `kind=text` to grep code,
`kind=snippet` to read a symbol's source, `kind=symbol` to force graph search.

Parameters:
- query: symbol name, natural-language phrase, code/text pattern, or a qualified_name
- project: project name; omit to auto-resolve
- kind: auto | symbol | text | snippet (default auto)
- regex: for text search, treat query as a regex (default False)
- file_pattern: glob to scope search, e.g. "*.py" (optional)
- limit: max results, 1-200 (default 20)

Returns: graph lookup response, or a graph-unavailable error if the graph
backend is disabled or failed to start
ParametersJSON Schema
NameRequiredDescriptionDefault
kindNoauto
limitNo
queryYes
regexNo
projectNo
file_patternNo

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Without annotations, the description carries the full burden. It discloses that the tool returns a 'graph lookup response, or a graph-unavailable error if the graph backend is disabled or failed to start.' It also explains the behavior of kind=auto based on query type. However, it does not detail the structure of the response or mention any authentication or rate limits, which would improve transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with an emoji, bolded key terms, a concise overview, and a bulleted parameter list. Every sentence adds value, and the length is appropriate for the complexity of the tool. It is front-loaded with the most important information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description effectively explains the tool's functionality and parameters, and it mentions the return type. Given the complexity (6 parameters, no output schema, no annotations, and many sibling tools), it is largely complete. However, it could briefly mention what a 'graph lookup response' contains or provide an example to further aid understanding.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description adds significant meaning beyond the input schema. For each parameter, it explains its purpose and behavior: e.g., query can be 'symbol name, natural-language phrase, code/text pattern, or a qualified_name'; kind options are detailed; regex is for text search; project can be omitted for auto-resolve; file_pattern is a glob. With 0% schema coverage, the description fully compensates.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Find code: symbols/definitions, text patterns, or a symbol's source.' It distinguishes itself by saying 'Use INSTEAD OF grep/glob,' and explains the different modes (auto, symbol, text, snippet), making it easy to understand what the tool does and how it differs from siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit guidance on when to use this tool and its alternatives: 'Use INSTEAD OF grep/glob.' It also explains the behavior of each kind value, e.g., 'kind=auto picks: a qualified_name reads source; otherwise it searches the graph by name/keyword. Set kind=text to grep code, kind=snippet to read a symbol's source, kind=symbol to force graph search.' This gives clear context for selecting the appropriate mode.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

marm_compactionA
Compact related memories into a single summary to reduce context bloat.

Workflow: status/candidates → stage → review → apply/discard

action="status"     — check if compaction candidates exist (run first)
action="candidates" — get pending candidates with source previews; each includes a ready-to-use prompt
action="stage"      — submit your summary: {candidate_id, suggested_summary}; source_memory_ids optional
action="review"     — inspect staged summaries before committing
action="apply"      — commit a staged summary; source memories are marked compacted
action="discard"    — reject a staged summary without touching source memories
ParametersJSON Schema
NameRequiredDescriptionDefault
actionYes
summariesNo
candidate_idNo

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden. It discloses key behaviors: apply marks source memories as compacted, discard leaves source memories untouched, and candidates include a 'ready-to-use prompt.' This is meaningful contextual information beyond the schema, though it does not mention all side effects or error conditions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and well-structured: a one-sentence purpose, a workflow arrow, and a bulleted action list. Every sentence provides useful information without redundancy or fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool has complexity (six actions, multiple parameters) and no output schema, so the description should clarify return values and expected behavior for each action. The workflow is explained, but the response/return format for actions like status or candidates is not described, leaving the user guessing about what data comes back. This is a significant omission for a stateful workflow.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It explains action values (status, candidates, stage, etc.) and the candidate_id parameter in context. However, the summaries parameter is never explicitly described, leaving ambiguity about its structure and usage (likely for batch apply, but not stated). This is a noticeable gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening sentence states the tool's exact purpose: 'Compact related memories into a single summary to reduce context bloat.' The verb (compact) and resource (memories) are clear, and the workflow action list distinguishes it from sibling tools like marm_log or marm_smart_recall.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides a clear workflow (status/candidates → stage → review → apply/discard) and tells the user to run status first. It gives context for each action but does not explicitly name alternative tools or state when not to use this tool, so it falls short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

marm_concept_buildA
🕸️ Extract entities/relationships from memory content into the concept graph.

Scope with session_name or project for a targeted build, or pass
search_all=True for everything (row-capped). Links extracted entities to
marm-graph code symbols when available. Call this before marm_concept_recall
— there's no data until a build has run at least once.

Parameters:
- session_name: scope extraction to this session; omit with search_all=True
- search_all: extract across all sessions, row-capped (default False)
- project: scope extraction to this project (optional)
- run_id: optional Console build-run ID for status polling

Returns: entities_extracted, relationships_created, code_links_created, duration_ms
ParametersJSON Schema
NameRequiredDescriptionDefault
run_idNo
projectNo
search_allNo
session_nameNo

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Describes extraction of entities/relationships, code linking, row-capping for search_all, and return fields. Lacks details on overwrite/durability behavior, but overall informative for a build tool with no annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Concise and well-structured with bullet-like parameter list and clear action verb. The emoji is non-essential but not harmful. Could be slightly tighter by removing redundant phrasing.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema, manually lists return values. Covers scoping options, linking behavior, and prerequisite ordering. Missing error conditions and permissions, but adequate for a build tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, but description compensates fully by explaining the purpose and interaction of all four parameters (session_name, search_all, project, run_id) beyond their titles.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states the action (extract entities/relationships) and the resource (concept graph). Distinguishes from sibling marm_concept_recall by specifying the ordering dependency.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly explains scoping via session_name/project or search_all=True, and advises calling this before marm_concept_recall, providing clear when-to-use and when-not-to guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

marm_concept_recallA
🔎 Search the concept graph: entities, their relationships, and linked code.

Query as a bare concept name for a lookup, or phrase it as "related to X"
to emphasize traversal — both route from query shape alone. Returns empty
lists (not an error) when marm_concept_build hasn't run yet or marm-graph
has no matching code symbols.

Parameters:
- query: concept name, or a "related to X" style ask
- session_name: scope to this session; omit to search across all (optional)
- limit: max entities/relationships returned, 1-100 (default 10)
- depth: max hop distance to traverse, 1-5 (default 1 = direct neighbors only)
- direction: outgoing | incoming | both (default both)
- project: scope to this project; entities with the same name in
  different projects are distinct nodes; omit to search across all (optional)
- platform: scope to this client/platform; omit to search across all (optional)

Returns: entities, related_entities, linked_code
ParametersJSON Schema
NameRequiredDescriptionDefault
depthNo
limitNo
queryYes
projectNo
platformNo
directionNoboth
session_nameNo

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations were provided, so the description must carry the full burden. It discloses that returns empty lists (not errors) when the graph hasn't been built or no matches exist, which sets correct expectations. It does not explicitly state read-only behavior, but that is implied from the search nature. This is adequate but could be improved.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with a brief paragraph followed by bullet points for parameters. It uses formatting (emoji, bold) to aid readability. While it could be slightly more concise, it doesn't waste words and every sentence adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 7 parameters and no output schema, the description explains inputs well but the return structure is only briefly mentioned ('Returns: entities, related_entities, linked_code') without further detail on the shape or content. This is a gap, but the tool's purpose is still understandable. It meets minimum viability.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema coverage is 0%, so the description must fully explain parameters. It does so for all 7 parameters: each has a clear purpose, default values, and acceptable ranges (e.g., limit 1-100, depth 1-5, direction enum). It adds meaning beyond the schema, which only defines types and defaults.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool searches the concept graph for entities, relationships, and linked code. It uses a specific verb (search, query) and resource (concept graph). However, it does not explicitly distinguish this tool from siblings like marm_smart_recall or marm_graph_trace, leaving ambiguity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides guidance on query styles ('bare concept name' vs 'related to X'), which helps with when to use each. However, it lacks explicit advice on when to choose this tool over siblings (e.g., vs marm_smart_recall for smarter retrieval, or marm_graph_trace for tracing). No exclusions or alternatives are mentioned.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

marm_deleteA
🗑️ Delete a log session, log entry, or notebook entry

type="log" + session_name: delete specific entry by id or topic
type="log" (no session_name): delete entire session and all its entries
type="notebook": delete notebook entry by name
ParametersJSON Schema
NameRequiredDescriptionDefault
typeYes
targetYes
projectNo
platformNo
session_nameNo

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Without annotations, the description adequately discloses the destructive behavior and scope of deletion. It explains what gets deleted based on parameter combinations, but does not mention irreversibility or cascading effects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description uses bullet points and emojis, which improves readability but adds length. It is clear but slightly verbose for the information conveyed.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a delete tool, the description provides sufficient context about what can be deleted and how. However, missing details on the 'target' parameter and no output schema reduce completeness slightly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description clarifies the interaction between 'type' and 'session_name' parameters, but does not explain the 'target', 'project', or 'platform' parameters. With 0% schema coverage, the description partially compensates but leaves gaps.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description explicitly states that the tool deletes log sessions, log entries, or notebook entries. It distinguishes between different deletion behaviors based on the 'type' and 'session_name' parameters, making the purpose clear and specific.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear patterns for when to use each variation: deleting a specific log entry, deleting an entire log session, or deleting a notebook entry. It implicitly guides the agent to use other tools for non-deletion operations, but does not explicitly mention alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

marm_graph_architectureA
🏛️ High-level architecture overview: node/edge breakdown, modules, and schema.

One-shot orientation for a project — the de-facto module clusters, package
structure, and the graph schema (node labels + properties) folded in.

Parameters:
- project: project name; omit to auto-resolve

Returns: graph architecture response, or a graph-unavailable error if the
graph backend is disabled or failed to start
ParametersJSON Schema
NameRequiredDescriptionDefault
projectNo

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It discloses the failure mode: 'graph-unavailable error if the graph backend is disabled or failed to start', and also notes that omitting the project parameter auto-resolves. This gives the agent useful expectations for both success and error cases.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Compact and well-organized: purpose in the first line, a clarifying sentence, then a parameter list and a returns line. Uses whitespace effectively and has no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers input, output (graph architecture response), and failure mode (graph-unavailable error). Without an output schema, it doesn't detail the response structure, but for an orientation tool this is a minor gap; the description is sufficient for basic invocation and expectation setting.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema only defines a nullable string with a default. The description adds critical meaning: 'project name; omit to auto-resolve' clarifies the parameter's purpose and the behavior when omitted, which is far beyond the schema's minimal info.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States 'High-level architecture overview: node/edge breakdown, modules, and schema' – a specific verb+resource combination that clearly distinguishes this from sibling tools like graph_trace or graph_impact. The noun phrase 'architecture overview' leaves no ambiguity about what the tool does.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly frames itself as 'one-shot orientation for a project', implying use when a high-level understanding is needed. It doesn't explicitly name alternatives, but the context of sibling tools plus the 'orientation' wording makes the intended use case clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

marm_graph_impactA
💥 Blast radius of code changes: git diff → affected symbols + risk.

Pass `since` (a git ref/date) or a `base_branch` to compare against. Returns
which symbols a change touches and how far the impact propagates.

Parameters:
- project: project name; omit to auto-resolve
- since: git ref or date to compare from, e.g. HEAD~5, v0.5.0 (optional)
- base_branch: base branch to diff against (default "main")
- depth: impact propagation depth, 1-5 (default 2)

Returns: graph impact response, or a graph-unavailable error if the graph
backend is disabled or failed to start
ParametersJSON Schema
NameRequiredDescriptionDefault
depthNo
sinceNo
projectNo
base_branchNomain

TDQS

A4.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden of behavioral disclosure. It usefully mentions the 'graph-unavailable error if the graph backend is disabled or failed to start' and describes the output conceptually. However, it does not explicitly state whether the operation is read-only, whether any mutation occurs, or any authentication requirements, leaving some ambiguity.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with a bold purpose statement, followed by usage, a bulleted parameter list, and return value. Every sentence earns its place, and the structure is clean and scannable. There is no redundant filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Since there is no output schema, the description explains returns: 'graph impact response, or a graph-unavailable error.' It also clarifies in the opening that the response includes affected symbols and propagation distance. This covers the essentials, though a more structured breakdown of the response object would make it more complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 0% description coverage, so the description must compensate. It does so thoroughly by listing all four parameters with meanings and examples: 'since: git ref or date to compare from, e.g. HEAD~5, v0.5.0', 'depth: impact propagation depth, 1-5', and defaults for base_branch and project. This adds significant semantic value beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening line 'Blast radius of code changes: git diff → affected symbols + risk' precisely states the tool's function with a specific verb and resource. It clearly distinguishes from sibling tools like marm_graph_trace (trace specific symbols) and marm_graph_architecture (architecture view) by focusing on impact propagation from a git diff.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear usage context: 'Pass `since` (a git ref/date) or a `base_branch` to compare against' and explains defaults for base_branch and depth. However, it does not explicitly name alternative tools or state when not to use this tool, relying on the purpose to differentiate from siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

marm_graph_indexA
🕸️ Index a code repository into the graph, or check status / list known projects.

Pass `repo_path` to index a repo (returns the project name to use in every
other tool). Omit it to list indexed projects, or pass `project` to check
index status. Call this first — all other graph tools need an indexed project.

Indexed repos are re-indexed automatically in the background. Use
`action="auto_off"` to stop that, `auto_on` to resume, `auto_status` to check.

Parameters:
- repo_path: path to the repository to index; omit to list/status only
- project: existing project name for a status check; omit to auto-resolve
- mode: index depth — full | moderate | fast (default moderate)
- action: auto | index | status | list (default auto; infers from repo_path
  presence), or auto_on | auto_off | auto_status to control automatic
  re-indexing

Returns: graph index/status/list response, or a graph-unavailable error if the
graph backend is disabled or failed to start
ParametersJSON Schema
NameRequiredDescriptionDefault
modeNomoderate
actionNoauto
projectNo
repo_pathNo

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description fully carries the behavioral disclosure burden. It reveals auto-reindexing ('Indexed repos are re-indexed automatically in the background'), the effects of action options, and the possible graph-unavailable error on backend failure. It does not cover permissions or side effects on the repo, but covers the core behaviors well.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is structured with a summary, parameter list, and return note. It front-loads the main purpose and stays under 200 words, but includes an unnecessary emoji and slightly redundant phrasing. Still, every section earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (4 optional params, multiple actions, auto-reindexing), the description covers the purpose, parameter semantics, usage order, and return/error behavior. It lacks concrete examples or response shape, but no output schema exists, so the description is sufficiently complete for an agent to invoke correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must compensate. It does by providing per-parameter explanations: repo_path as index vs list/status, project as status check, mode as depth, and action as explicit enum with inference rules. This adds substantial meaning beyond titles and enums.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a clear verb+resource statement: 'Index a code repository into the graph, or check status / list known projects.' It also differentiates itself from sibling graph tools by explicitly stating 'Call this first — all other graph tools need an indexed project,' establishing it as the prerequisite setup tool.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear usage context: 'Call this first' and explains when to pass vs omit repo_path and project. It outlines the three main action modes (index, status, list) and the auto-reindexing controls, but does not explicitly name alternative tools for other graph operations, relying on the prerequisite statement to imply exclusion.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

marm_graph_traceA
🧭 Trace call paths / data flow through the graph from a function.

`direction=inbound` finds callers, `outbound` finds callees, `both` for all.
`mode=data_flow` follows value propagation. `cross_service` attempts HTTP/async
boundaries but does not currently join a client call to its server handler, so
treat an empty result as unknown rather than as "nothing calls this".
Use for impact analysis, dependency tracing, "who calls this".

Parameters:
- function_name: function or method to trace from
- project: project name; omit to auto-resolve
- direction: inbound | outbound | both (default both)
- depth: max hops, 1-5 (default 3)
- mode: calls | data_flow | cross_service (default calls)
- risk_labels: add CRITICAL/HIGH/MEDIUM/LOW risk tiers by hop distance (default True)
- include_tests: also return callers in test files (default False)
- include_evidence: per-hop `strategy` (lsp | language_rule | heuristic | unresolved)
  and `confidence`, so a guessed edge is distinguishable from a resolved one
  (default True). Test callers typically come back heuristic at low confidence

Returns: graph trace response, or a graph-unavailable error if the graph
backend is disabled or failed to start
ParametersJSON Schema
NameRequiredDescriptionDefault
modeNocalls
depthNo
projectNo
directionNoboth
risk_labelsNo
function_nameYes
include_testsNo
include_evidenceNo

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full behavioral burden and does so well. It discloses the cross_service limitation that an empty result means 'unknown' and defines evidence strategies and confidence levels so guessed edges are transparently distinguishable. Error behavior for an unavailable graph backend is also explicitly documented.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The prepended emoji and short purpose line front-load the key operation. Parameters are grouped in a compact bullet-style list, and each sentence adds either setup, a limitation, or parameter behavior. It is information-dense without being bloated for a tool with 8 parameters.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description is thorough for a complex tool with no output schema or annotations: it covers behavioral caveats, direction/mode choices, evidence semantics, and backend failure. The main gap is that the return value is only described as a generic 'graph trace response', and it doesn't define the result graph shape or edge fields. Still, this is quite complete for an agent's invocation needs.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has 0% description coverage, but the tool description covers all 8 parameters with meaningful semantics. It adds constraints like depth 1-5, auto-resolution for project, direction/mode meanings, risk-label behavior, and evidence strategy values. This fully compensates for the bare schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description starts with a specific action: 'Trace call paths / data flow through the graph from a function,' which clearly identifies the tool's purpose. It also lists concrete use cases ('impact analysis, dependency tracing, who calls this') that help orient an agent. The only slight overlap with the sibling marm_graph_impact is minor because this tool centers on graph traversal from a function.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives actionable direction/mode guidance (inbound vs outbound vs data_flow vs cross_service) and states 'Use for impact analysis, dependency tracing, who calls this.' However, it doesn't explicitly state when not to use it, nor name alternatives like marm_graph_impact, marm_code_lookup, or marm_graph_architecture. Clear context exists, but exclusion/alternative guidance is missing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

marm_log_entryA
📝 Write a log entry to the active session.

Entries are stored with a date, topic, and summary. If `entry` begins with
"Session: [name]" or "Topic: [name]", the active session switches to that name
and all subsequent entries route there automatically. Entries are also stored
as semantic memories so marm_smart_recall can find them.

Entry format: YYYY-MM-DD-topic-summary (date prefix is optional; auto-tagged if omitted)

Parameters:
- entry: the text to log; plain text or prefixed with "Session:" / "Topic:" to switch sessions
- session_name: override the target session explicitly (optional; active session used if omitted)

Returns: status, message confirming the entry or session switch, entry_id, memory_id
ParametersJSON Schema
NameRequiredDescriptionDefault
entryYes
session_nameNo

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries full burden. It discloses key behaviors: entries are stored with date/topic/summary, session switching via prefix, auto-tagging of date, and storage as semantic memories for recall. It also notes return values.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is somewhat lengthy but well-structured with bullet points and clear sections. Every sentence adds value, and the purpose is front-loaded. It could be slightly more concise, but it effectively communicates necessary details.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema and low schema coverage, the description fully compensates by explaining return values, complex session-switching behavior, and storage side-effects. It is complete enough for an AI agent to use correctly without additional references.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must fully define parameters. It explains that 'entry' is the text to log with optional prefixes for session/topic switching, and 'session_name' is an optional override. This adds significant meaning beyond the bare schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool writes a log entry to the active session, specifying the resource (log entry, active session) and verb (write). It distinguishes from siblings like marm_log_show (read) and marm_smart_recall (recall), which have different verbs.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains when to use the tool (to write a log entry) and gives detailed formatting and session-switching rules. However, it does not explicitly state when not to use it or mention alternatives, though the context from sibling names implies this.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

marm_log_showA
📋 List log sessions or show entries for a specific session.

Two modes depending on whether `session_name` is provided:
- No session_name: returns a summary of all sessions with entry counts
- With session_name: returns all entries for that session, ordered by date descending

Parameters:
- session_name: name of the session to inspect (omit to list all sessions)

Returns (no session_name): status, sessions list with session_name/entry_count, total_sessions
Returns (with session_name): status, session_name, entries list with id/entry_date/topic/summary/full_entry, total_entries
ParametersJSON Schema
NameRequiredDescriptionDefault
session_nameNo

TDQS

A4.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations exist, so description carries full burden. Describes two modes and return structures. However, does not disclose if the operation is read-only, or any potential side effects. Since it's a log viewer, likely safe, but not explicitly stated.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Description is well-structured with bullet points and clear sections. Every sentence adds value without redundancy. Efficiently covers purpose, modes, parameters, and return formats.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has 1 parameter, no output schema, and no annotations, the description fully covers both modes, parameter behavior, and expected return structure. No gaps in essential information.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Only one parameter (`session_name`) with schema coverage 0%. Description fully explains that it's optional and its effect on output. Provides more semantic meaning than the schema alone, which only has type and default.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states it lists log sessions or shows entries for a specific session. Distinguishes two modes based on `session_name` presence. Action verb 'list' and 'show' combined with resource 'log sessions/entries' make purpose concrete.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explains which mode triggers when `session_name` is provided or omitted. Provides explicit context for each usage. Does not explicitly exclude scenarios or compare to sibling tools, but the guidance is clear and actionable.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

marm_notebookA
📔 Unified notebook — add, use, show, status, clear, or save

action="add": save or update a scratch entry (name + data required)
action="use": activate entries as instructions (names required, comma-separated)
action="show": list scratch entries for this session with previews
action="status": show currently active entries
action="clear": clear the active entry list
action="save": promote a scratch entry (or new data) into the permanent docs store
ParametersJSON Schema
NameRequiredDescriptionDefault
dataNo
nameNo
namesNo
actionYes
projectNo
platformNo
session_nameNomain

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden of behavioral disclosure. It does describe side effects: updating scratch entries, activating instructions, clearing the active list, and promoting to permanent docs. But it omits important behaviors like whether 'clear' also deletes scratch entries, whether 'save' removes the source entry, and session persistence semantics. This is partial transparency, not full.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is exceptionally well-structured: a single-line summary followed by a bulleted list of actions, each one sentence. There is no fluff, and the format makes the multi-action tool easy to scan and understand quickly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool has 7 parameters, multiple actions, no annotations, and no output schema, yet the description only explains a subset of actions and three of the seven parameters. It lacks the underlying conceptual model (scratch vs. active vs. permanent) and never mentions return values or session-specific behaviors. This is insufficient for an agent to fully anticipate tool behavior.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description adds meaning for action, name, data, and names by specifying their required status per action (e.g., 'name + data required' for add). However, it completely ignores project, platform, and session_name, which are present in the schema with zero documentation. Since schema coverage is 0%, the incomplete parameter guidance creates a significant gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the tool as a unified notebook manager with six explicit verbs (add, use, show, status, clear, save). It distinguishes this from sibling tools like marm_log_entry or marm_smart_recall by framing it as a scratch/active entry management tool, making its purpose unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Per-action instructions imply when to use each subcommand (e.g., 'add' for saving scratch entries, 'use' for activating instructions), and the 'notebook' context implies a general use case. However, it never explicitly contrasts with alternatives or states when not to use this tool, and there is no high-level guidance on sibling tool selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

marm_smart_recallA
🧠 Recall memories by semantic similarity or keyword match.

Searches stored memories for the most relevant matches to `query`.
Returns a ranked list of results with similarity scores. When a compatible
concept graph exists, the response also includes bounded relationship and
linked-code context without changing memory ranking.

Parameters:
- query: natural language search term or phrase
- session_name: limit search to a specific session (default searches active session)
- limit: maximum number of results to return (default 5)
- search_all: if True, search across all sessions instead of just the active one
- include_logs: if True, include log entries alongside memory results
- detail: controls how much content is returned per result
    1 = summary only (~200 chars)
    2 = extended context (~500 chars)
    3 = full content
- exact_mode: retrieval lane to use
    'auto'     = automatically switch to exact/lexical for syntax-heavy queries
                 (config keys, file paths, CLI commands, API names, code snippets)
    'exact'    = always use deterministic FTS/BM25, no semantic re-ranking
    'semantic' = always use vector similarity regardless of query shape
- project: filter results to a specific project (e.g. "marm-memory"); omit to search all
- platform: filter results to a specific platform (e.g. "claude-code", "cursor"); omit to search all

Returns: status, ranked results, graph_context, and results_count
ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
queryYes
detailNo
projectNo
platformNo
exact_modeNoauto
search_allNo
include_logsNo
session_nameNodefault

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries full burden. It discloses read-like behavior (search, return ranked results, graph context) but omits details like error handling, performance characteristics, or any destructive potential. Adequate but not thorough.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well-structured with a concise header, summary paragraph, and clear parameter list. Every sentence adds value without redundancy. Uses formatting (emojis, line breaks) for readability.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 9 parameters, no annotations, and no output schema, the description covers purpose, all parameters, and return fields (status, ranked results, graph_context, results_count). Missing details on result structure or graph_context, but largely complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, but the description provides detailed explanations for all 9 parameters, including enumeration for 'exact_mode' and implications for 'detail' levels. This adds significant meaning beyond the raw schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states the tool recalls memories by semantic similarity or keyword match, with a clear verb (searches/recalls) and resource (memories). It distinguishes from siblings like marm_concept_recall by mentioning similarity scores and graph context, but does not explicitly compare.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this tool versus siblings. It describes what it does but does not state when NOT to use it or provide alternatives for specific use cases like exact matching or code lookup.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

marm_summaryA
📊 Generate paste-ready context block for new chats

Reads log_entries for the session and returns a formatted markdown summary.
Equivalent to /summary: [session name] command
ParametersJSON Schema
NameRequiredDescriptionDefault
session_nameYes

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries full burden. It states it reads log_entries and returns a markdown summary, suggesting a read-only operation. However, it does not disclose potential side effects, prerequisites (e.g., session existence), or limits (e.g., entry count). Adequate but not detailed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise: a clear headline sentence, a brief explanation, and a command equivalence. Every sentence adds value without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (single param, read-only), the description covers the core purpose and output format (markdown). It could mention if it only reads from the provided session or has size limits, but overall it is fairly complete for a straightforward tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has 0% description coverage, so the description must add meaning. It mentions 'Equivalent to /summary: [session name] command', which hints that session_name is the session's name. This provides some context beyond the bare schema, but still lacks format details or examples.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool generates a 'paste-ready context block for new chats' by reading log entries and returning a formatted markdown summary. This distinguishes it from siblings like marm_log_show (raw logs) and marm_log_entry (adding entries).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage by equating to a /summary command, indicating it should be used to get a compact summary. However, it does not explicitly state when to use vs. alternatives like marm_log_show or marm_smart_recall, nor provide when-not-to-use guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 1 tool updatev2.40.0
    • Changedmarm_graph_trace2 fields changed
      • addedInput schema / properties / include_evidence
        Added value: +{
        +  "default": true,
        +  "title": "Include Evidence",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / include_tests
        Added value: +{
        +  "default": false,
        +  "title": "Include Tests",
        +  "type": "boolean"
        +}
  2. 1 tool updatev2.37.0
    • Changedmarm_graph_index1 field changed
      • changedInput schema / properties / action / enum
        Previous value: -[
        -  "auto",
        -  "index",
        -  "status",
        -  "list"
        -]New value: +[
        +  "auto",
        +  "index",
        +  "status",
        +  "list",
        +  "auto_on",
        +  "auto_off",
        +  "auto_status"
        +]
  3. 5 tool updatesv2.35.0
    • Addedmarm_compaction
    • Addedmarm_graph_architecture
    • Addedmarm_graph_impact
    • Addedmarm_graph_index
    • Addedmarm_notebook
  4. 7 tool updatesv2.25.0
    • Removedmarm_compaction
    • Changedmarm_concept_recall1 field changed
      • addedInput schema / properties / platform
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Platform"
        +}
    • Changedmarm_delete2 fields changed
      • addedInput schema / properties / platform
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Platform"
        +}
      • addedInput schema / properties / project
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Project"
        +}
    • Removedmarm_graph_architecture
    • Removedmarm_graph_impact
    • Removedmarm_graph_index
    • Removedmarm_notebook
  5. 2 tool updatesv2.21.0
    • Addedmarm_concept_build
    • Addedmarm_concept_recall
  6. 12 tool updatesv2.17.1
    • Addedmarm_code_lookup
    • Changedmarm_compaction6 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / action / title
        Added value: +"Action"
      • addedInput schema / properties / candidate_id / title
        Added value: +"Candidate Id"
      • addedInput schema / properties / summaries / title
        Added value: +"Summaries"
      • addedInput schema / title
        Added value: +"marm_compactionArguments"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "type": "object"
        -}New value: +null
    • Changedmarm_delete6 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / session_name / title
        Added value: +"Session Name"
      • addedInput schema / properties / target / title
        Added value: +"Target"
      • addedInput schema / properties / type / title
        Added value: +"Type"
      • addedInput schema / title
        Added value: +"marm_deleteArguments"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "type": "object"
        -}New value: +null
    • Addedmarm_graph_architecture
    • Addedmarm_graph_impact
    • Addedmarm_graph_index
    • Addedmarm_graph_trace
    • Changedmarm_log_entry5 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / entry / title
        Added value: +"Entry"
      • addedInput schema / properties / session_name / title
        Added value: +"Session Name"
      • addedInput schema / title
        Added value: +"marm_log_entryArguments"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "type": "object"
        -}New value: +null
    • Changedmarm_log_show4 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / session_name / title
        Added value: +"Session Name"
      • addedInput schema / title
        Added value: +"marm_log_showArguments"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "type": "object"
        -}New value: +null
    • Changedmarm_notebook8 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / action / title
        Added value: +"Action"
      • addedInput schema / properties / data / title
        Added value: +"Data"
      • addedInput schema / properties / name / title
        Added value: +"Name"
      • addedInput schema / properties / names / title
        Added value: +"Names"
      • addedInput schema / properties / session_name / title
        Added value: +"Session Name"
      • addedInput schema / title
        Added value: +"marm_notebookArguments"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "type": "object"
        -}New value: +null
    • Changedmarm_smart_recall12 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / detail / title
        Added value: +"Detail"
      • addedInput schema / properties / exact_mode / title
        Added value: +"Exact Mode"
      • addedInput schema / properties / include_logs / title
        Added value: +"Include Logs"
      • addedInput schema / properties / limit / title
        Added value: +"Limit"
      • addedInput schema / properties / platform / title
        Added value: +"Platform"
      • addedInput schema / properties / project / title
        Added value: +"Project"
      • addedInput schema / properties / query / title
        Added value: +"Query"
      • addedInput schema / properties / search_all / title
        Added value: +"Search All"
      • addedInput schema / properties / session_name / title
        Added value: +"Session Name"
      • addedInput schema / title
        Added value: +"marm_smart_recallArguments"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "type": "object"
        -}New value: +null
    • Changedmarm_summary4 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / session_name / title
        Added value: +"Session Name"
      • addedInput schema / title
        Added value: +"marm_summaryArguments"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "type": "object"
        -}New value: +null
  7. 1 tool updatev2.15.2
    • Changedmarm_smart_recall3 fields changed
      • addedInput schema / properties / exact_mode
        Added value: +{
        +  "default": "auto",
        +  "type": "string"
        +}
      • addedInput schema / properties / platform
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null
        +}
      • addedInput schema / properties / project
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null
        +}
  8. 7 tool updatesv2.14.1
    • First observedmarm_compaction
    • First observedmarm_delete
    • First observedmarm_log_entry
    • First observedmarm_log_show
    • First observedmarm_notebook
    • First observedmarm_smart_recall
    • First observedmarm_summary

TDQS

A3.9/5.0

Scored across 14 tools

Disambiguation4/5

Tools are mostly distinct: memory recall, logging, session listing, deletion, notebook, summary, compaction, and graph operations each have clear purposes. Minor overlap exists between smart_recall and log_show (both retrieve stored content) and between code_lookup and graph_trace (both explore code), but the descriptions differentiate them well.

Naming Consistency3/5

All tools share the 'marm_' prefixaine, but the naming convention is inconsistent: some use noun phrases (marm_smart_recall, marm_log_entry, marm_graph_architecture), some use bare verbs (marm_delete), and some combine verb+object (marm_code_lookup, marm_log_show). The pattern is not uniform, making it slightly harder to predict tool names.

Tool Count4/5

The stated count is 14, but only 11 tools are documented, which is a notable discrepancy. Even so, the 11 visible tools cover memory management and code-graph analysis without feeling bloated; a handful of tools for each subdomain is reasonable.

Completeness4/5

The surface covers search, logging, notebook CRUD, summaries, compaction, and code-graph analysis (index, lookup, trace, architecture). Missing explicit update operations and a dedicated session-management tool, but these are partially handled via log_entry parameters. Overall well-rounded for a memory + code context server.

Maintenance

ActivityActive
ResponsivenessWithin a week

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    C
    maintenance
    MCP server for persistent, compounding memory that automatically captures corrections and insights across AI sessions, enabling agents to learn and improve over time.
    5
    371
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables AI agents to maintain persistent memory across sessions by capturing conversations, extracting durable knowledge, and injecting relevant context, supporting various MCP-compatible platforms.
    12
    MIT
  • A
    license
    B
    quality
    A
    maintenance
    MCP server providing persistent memory and context for AI tools, including semantic memory, knowledge graph, and session history to avoid starting from scratch in every conversation.
    35
    14
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    MCP server that provides AI agents with persistent memory, cross-agent sharing, and context management, enabling them to remember conversations, track complex tasks, and evolve skills across tools.
    2
    MIT