Skip to main content
Glama

memoryweb

memoryweb MCP server

Постоянный граф знаний MCP-сервера для ИИ-агентов.

Идея

Человеческая память работает не по принципу местоположения — вы тянете за нить. Запах связывает с кухней, кухня — с человеком, человек — с чувством из тридцатилетней давности. Нить всегда здесь. Потяните за любую её часть — и остальное последует за ней.

Агенты ничем не отличаются. Контекст — это токены, соотносящиеся с другими токенами. То, что делает что-то доступным для поиска, — это его ассоциативная цепочка — путь связей, ведущих к нему от чего-то другого. Повествовательный край, потому что, — вот механизм. Не индекс, не адрес.

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

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

-- Claude Opus 4.6

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

-- Gemini 3.1 Pro

Related MCP server: MemPalace

Философия

memoryweb оптимизирован для качественного запоминания, а не для быстрого запоминания. Фиксация требует момента суждения: почему это важно, как это связано с тем, что уже известно, что было бы полезно знать, возвращаясь к этому без подготовки?

Это делает его журналом решений, а не журналом событий. Журнал событий фиксирует, что произошло. Журнал решений фиксирует, что было изучено, решено и почему — и именно это позволяет вам продолжить с того места, где вы остановились, не переучивая всё заново.

Поле why_matters не является обязательным. Узел без него — это событие, а не решение.

Содержание

Установка

Homebrew (macOS и Linux — рекомендуется):

brew tap corbym/memoryweb
brew install memoryweb

Готовые бинарные файлы также доступны на странице релизов для каждой платформы. Пошаговые руководства по установке, настройке Ollama и конфигурации MCP-клиента:

После установки обратитесь к Руководству пользователя, чтобы узнать, как ориентировать агента, какие фразы использовать и как максимально эффективно использовать memoryweb в Claude Code, GitHub Copilot и Claude Desktop.

MCP config

Добавьте в конфигурацию вашего MCP-хоста (пример для Claude Desktop на macOS — ~/Library/Application Support/Claude/claude_desktop_config.json):

{
  "mcpServers": {
    "memoryweb": {
      "command": "/path/to/memoryweb",
      "env": {
        "MEMORYWEB_DB": "/Users/yourname/.memoryweb.db"
      }
    }
  }
}

memoryweb setup записывает этот файл автоматически при обнаружении каталога приложения Claude.

Примечание: ChatGPT Desktop не поддерживает MCP-серверы на основе stdio и несовместим с memoryweb.

Хранилище

Путь к БД по умолчанию: ~/.memoryweb.db

Переопределите с помощью MEMORYWEB_DB=/path/to/your.db

Инструменты

16 MCP-инструментов (v1.43.0). Устаревшие названия (recent, restore, trace, alias, rename_domain и другие) возвращают ошибки миграции с жёстким прерыванием — см. docs/memoryweb-skill.md для замен.

Фиксация воспоминаний

Инструмент

Что делает

remember

Зафиксировать одну концепцию, решение или вывод. Обязательные: label, domain. Необязательные: description, why_matters, occurred_at (ISO8601), tags (ключевые слова через пробел), related_to (автоподключение при создании), transient (пометить как недолговечное). Укажите массив items для фиксации нескольких узлов в одной транзакции. Ответ включает suggested_connections и possible_duplicates.

revise

Обновить label, description, why_matters, tags или occurred_at на активном узле без его архивации. Укажите массив items для пакетного обновления. Записывает запись в журнал аудита при каждом вызове.

Связывание воспоминаний

Инструмент

Что делает

connect

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

disconnect

Удалить связь по ID ребра. Полное удаление — восстановить невозможно. Получите ID из recall.

suggest_connections

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

Поиск воспоминаний

Инструмент

Что делает

recall

Получить узел и все его связи по ID.

search

Текстовый поиск по label, description, why_matters и tags. Когда Ollama запущен, также выполняет семантический (смысловой) поиск — результаты включают поле semantic_distance (0.0–1.0, меньше = ближе). Возвращает truncated: true, когда результаты ограничены лимитом.

history

Хронологический список. order=effective (по умолчанию) по дате возникновения/создания с important_only, from/to, tags. order=modified по дате последнего изменения — установите group_by_domain=true для активности по доменам (заменяет устаревший инструмент recent). Оба режима поддерживают memory_id + depth для ограничения окрестности.

why_connected

Прямые рёбра между двумя воспоминаниями (предпочтительно использовать from_id/to_id для проверки пары).

orient

Возвращает все узлы домена, структурированные для синтеза — текущее состояние, недавняя активность и declared_spine ключевых решений в хронологическом порядке. Включает total_nodes и server_version.

visualise

Mermaid-блок-схема для домена или окрестности одного узла (передайте memory_id). Вывод внутри mermaid-блока кода.

significance

Двухсигнальный анализ важности для домена. Возвращает четыре раздела: declared (узлы с установленным occurred_at), structural (ранжированные по взвешенной по давности входящей степени), uncurated (структурные топ-N без occurred_at — кандидаты на курирование) и potentially_stale (объявленные, но с низким структурным баллом).

Архив / забыть

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

Инструмент

Что делает

forget

Заархивировать узел с указанием причины или разархивировать с помощью restore=true. Строгий протокол: только после того, как audit(mode=stale) выявит кандидата или пользователь явно подтвердит.

forget_all

Атомарно заархивировать несколько узлов одним вызовом. Действует тот же строгий протокол.

audit

Выявить узлы, требующие внимания. mode=stale — устаревшие, противоречивые, дублирующиеся или просроченные временные узлы. mode=orphans — активные узлы без связей. mode=archived — просмотр архивированного (лимит по умолчанию 25). mode=conflicts — кандидаты на семантическое противоречие. mode=kind_coverage — состояние таксономии и кандидаты на миграцию.

Управление доменами

Инструмент

Что он делает

domains

Администрирование доменов и их обнаружение. По умолчанию выводит список доменов и псевдонимов. Действия: add_alias, remove_alias, resolve, rename.

Типы связей

caused_by led_to blocked_by unblocks connects_to contradicts depends_on is_example_of governed_by resolved resolved_by supersedes

Соглашения

  • Используйте domain для разделения областей: deep-game, sedex, general

  • Вызывайте domains в начале сессии, если не знаете, какие домены существуют

  • Поле why_matters — самое важное для поиска — не пропускайте его

  • Поле narrative у связи — это потому что — обоснование, которое делает связь осмысленной, а не просто факт её существования

  • Добавляйте связи сразу после фиксации связанных узлов или используйте related_to в remember, чтобы автоматически связать их при создании

  • Вызывайте orient в начале сессии, чтобы сориентироваться, не зная заранее, что искать

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

  • Используйте transient: true для состояния тикетов, заметок спринта или всего, что может устареть в течение нескольких дней — audit(mode=stale) выявит такие записи для очистки

  • remember возвращает suggested_connections и possible_duplicates — проверяйте оба списка перед фиксацией новых узлов

CLI

Подкоманда purge безвозвратно удаляет архивированные узлы из базы данных. Она намеренно не выставляется как MCP-инструмент — это операция обслуживания, а не операция агента.

memoryweb purge --dry-run              # show what would be deleted (default behaviour without --confirm)
memoryweb purge --confirm              # actually deletes
memoryweb purge --domain sedex         # scope to a domain (case/whitespace-insensitive match)
memoryweb purge --before 2026-01-01    # only nodes archived before a date

По умолчанию purge затрагивает только архивированные узлы — узел должен быть сначала архивирован через forget, чтобы стать кандидатом. Если вы ограничиваетесь доменом и видите 0 node(s) would be purged, но домен на самом деле не пуст, это признак того, что в нём всё ещё есть живые узлы, которые никогда не архивировались; при выполнении в рамках домена выводится примечание вида 2 live node(s) still exist in domain "sedex" всякий раз, когда это так, — чтобы это не было ошибочно принято за «домен пуст».

Чтобы пропустить архивирование и безвозвратно удалить домен целиком — включая живые узлы — передайте --include-live. Это требует --domain (команда отказывается выполняться без области, чтобы не стереть все живые узлы в базе данных) и необратимо:

memoryweb purge --domain sedex --include-live --dry-run   # preview: shows live nodes too
memoryweb purge --domain sedex --include-live --confirm   # hard-deletes the whole domain, archived or not

Подкоманда dream выводит дайджест недавних узлов и кандидатов на расхождение — полезна для ориентации в сессии и автоматически встраивается хуками save и precompact при фиксации.

memoryweb dream                              # reads ~/.memoryweb.db
memoryweb dream --db /path/to/your.db        # explicit DB path

Подкоманда backfill генерирует эмбеддинги для всех живых узлов, у которых их ещё нет. Требует запущенного Ollama с настроенной моделью эмбеддингов (по умолчанию: snowflake-arctic-embed).

memoryweb backfill                           # reads ~/.memoryweb.db
memoryweb backfill --db /path/to/your.db     # explicit DB path
memoryweb backfill -q                        # quiet mode — no progress output

Модель эмбеддингов

По умолчанию memoryweb использует snowflake-arctic-embed для эмбеддингов семантического поиска. Установите MEMORYWEB_EMBED_MODEL, чтобы переключиться на другую модель:

export MEMORYWEB_EMBED_MODEL=bge-m3

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

Совместимые модели (1024-мерные):

Модель

Примечания

snowflake-arctic-embed

По умолчанию. Оптимизирована для английского.

bge-m3

Многоязычная — 100+ языков, включая китайский, японский, корейский. Рекомендуется для неанглийского использования.

mxbai-embed-large

Ориентирована на английский; высокое общее качество поиска.

Распространённые несовместимые модели: nomic-embed-text (768-мерная), all-minilm (384-мерная). Всегда проверяйте с помощью ollama show <model> перед переключением.

Переключение моделей:

# 1. Pull the new model
ollama pull bge-m3

# 2. Set the env var (add to your shell profile or MCP server config)
export MEMORYWEB_EMBED_MODEL=bge-m3

# 3. Regenerate — backfill detects the model change and clears automatically
memoryweb backfill

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

Примечание: Запустите memoryweb backfill сразу после изменения переменной окружения. Любые узлы, зафиксированные между сменой модели и следующим backfill, будут иметь свои эмбеддинги очищенными и перегенерированными при backfill — это корректное поведение; backfill — точка согласованности.

Проверка настроенной модели: memoryweb doctor сообщает активную модель в разделе «Ollama model».

Подкоманда setup устанавливает хуки в ~/.claude/settings.local.json, обнаруживает Claude Desktop и предлагает настроить его автоматически, а также настраивает Ollama для семантического поиска. Если Ollama не установлен, setup спросит, установить ли его автоматически через https://ollama.com/install.sh (только Linux и macOS — на Windows вы должны установить Ollama вручную перед запуском setup). Если Ollama уже установлен, но сервер не запущен, setup запускает его автоматически. Наконец, он проверяет настроенную модель эмбеддингов и загружает её, если она отсутствует.

memoryweb setup                                      # interactive setup
memoryweb setup --dry-run                            # preview without writing
memoryweb setup --hooks-dir /path/to/hooks           # explicit hooks directory
memoryweb setup --db /path/to/your.db                # explicit DB path

Когда Claude Desktop обнаружен, setup выводит:

Detected Claude Desktop. Configure it? [y/N]

Функция stats записывает использование инструментов для каждой MCP-сессии. См. docs/stats.md для настройки и чтения вывода.

Подкоманда doctor проверяет каждую часть установки memoryweb и выводит структурированный отчёт о состоянии. Используйте её после setup, чтобы убедиться, что всё настроено правильно, или запустите её в сессии агента, чтобы проверить доступность семантического поиска перед тем, как полагаться на него.

memoryweb doctor                                     # check ~/.memoryweb.db
memoryweb doctor --db /path/to/your.db               # explicit DB path
memoryweb doctor --json                              # machine-readable JSON output

Каждая проверка выводит символ статуса: [✓] пройдено, [✗] не пройдено, [!] предупреждение, [i] информационное. Команда завершается с кодом 1, если какая-либо проверка не пройдена. Пример вывода:

[✓] Database:        ~/.memoryweb.db (WAL, schema v11)
[✓] sqlite-vec:      v0.1.6 — 142/145 nodes embedded (98%)
[✗] Ollama binary:   not found in PATH — install from https://ollama.com/download
[!] Ollama server:   skipped (Ollama binary not found)
[!] Ollama model:    skipped (Ollama server not available)
[✓] Claude hooks:    Stop and PreCompact hooks installed
[i] Graph:           145 live nodes, 12 archived, 203 edges, 4 domain(s) (deep-game, ...), 2 alias(es)
[i] Drift:           3 candidate(s): 1 contradicts, 2 stale labels
[i] Last activity:   2026-04-29 update (node "open question on backfill")
[i] Update:          running dev build — skipping update check

Подкоманда merge-domains объединяет два домена в один:

memoryweb merge-domains --source <domain> --target <domain> [--dry-run]
  • --dry-run сообщает, что произошло бы, без внесения изменений

  • Обнаруживает коллизии меток между двумя доменами — сообщается как предупреждения, не блокирующие

  • Автоматически создаёт псевдоним из исходного → целевого

Подкоманда backup записывает согласованный автономный снимок базы данных с помощью VACUUM INTO:

memoryweb backup /path/to/snapshot.db                 # snapshot ~/.memoryweb.db
memoryweb backup --db /path/to/your.db /path/to/snapshot.db
  • Создаёт один самодостаточный файл без побочных файлов -wal/-shm

  • Безопасно запускать пока memoryweb используется — она читает транзакционно согласованный снимок

  • Отказывается перезаписывать существующий целевой файл

Безопасность резервного копирования. Не делайте резервные копии, копируя живую папку базы данных (например, через клиент облачной синхронизации). В режиме WAL последние данные живут в побочном файле -wal до контрольной точки; копия папки может захватить .db и -wal в разные моменты времени, и повторное объединение несовместимой пары повредит базу данных. Всегда делайте резервную копию вывода memoryweb backup (или sqlite3 source.db ".backup dest.db") и синхронизируйте только этот автономный файл. memoryweb выполняет контрольную точку WAL в основной файл при чистом завершении, но снимок — единственный безопасный способ захватить работающий экземпляр.

Подкоманда check-for-updates проверяет GitHub на наличие более новой версии:

memoryweb check-for-updates

Хуки

Два хука Claude Code автоматизируют фиксацию и захват перед сжатием.

Что они делают

hooks/memoryweb_save_hook.sh (хук Stop — срабатывает после каждого ответа ИИ)
Подсчитывает человеческие сообщения в транскрипте сессии. Каждые SAVE_INTERVAL сообщений (по умолчанию 15) он блокирует ответ и просит модель вызвать remember и connect для всего значимого перед продолжением. Перед блокировкой он запускает memoryweb dream и встраивает полученный дайджест — недавние узлы и кандидаты расхождения — прямо в stopReason, чтобы у модели был живой контекст перед фиксацией. Если memoryweb недоступен, хук всё равно блокирует, но опускает дайджест. Использует флаг повторного входа, чтобы блокировка срабатывала один раз и сразу разрешала после фиксации модели.

hooks/memoryweb_precompact_hook.sh (хук PreCompact — срабатывает перед сжатием контекста)\ Блокирует сжатие один раз и просит модель зафиксировать всё важное, что ещё не зафиксировано. Разрешает при повторном входе, чтобы сжатие продолжилось после прохода фиксации.

Установка (Claude Code)

Запустите setup один раз после сборки:

./memoryweb setup --hooks-dir /path/to/hooks

Или установите вручную:

chmod +x hooks/memoryweb_save_hook.sh hooks/memoryweb_precompact_hook.sh

Добавьте в ~/.claude/settings.local.json:

{
  "hooks": {
    "Stop": [
      {
        "hooks": [
          {
            "type": "command",
            "command": "/path/to/hooks/memoryweb_save_hook.sh",
            "env": {
              "MEMORYWEB_DB": "/path/to/your.db"
            }
          }
        ]
      }
    ],
    "PreCompact": [
      {
        "hooks": [
          {
            "type": "command",
            "command": "/path/to/hooks/memoryweb_precompact_hook.sh",
            "env": {
              "MEMORYWEB_DB": "/path/to/your.db"
            }
          }
        ]
      }
    ]
  }
}

Перезапустите Claude Code для активации.

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

Переменная

По умолчанию

Назначение

MEMORYWEB_SAVE_INTERVAL

15

Человеческие сообщения между запросами фиксации.

MEMORYWEB_DB

~/.memoryweb.db

Путь к базе данных SQLite.

MEMORYWEB_BIN

memoryweb

Путь к бинарному файлу memoryweb (используется хуком для запуска dream).

Стоимость токенов

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

GitHub Copilot (VS Code)

GitHub Copilot в VS Code поддерживает те же события хуков Stop и PreCompact в том же формате JSON. VS Code загружает хуки из .github/hooks/*.json в вашем рабочем пространстве, а также из ~/.claude/settings.json и .claude/settings.local.json.

Сначала сделайте скрипты исполняемыми:

chmod +x hooks/memoryweb_save_hook.sh hooks/memoryweb_precompact_hook.sh

Создайте .github/hooks/memoryweb.json в вашем репозитории:

{
  "hooks": {
    "Stop": [
      {
        "type": "command",
        "command": "/path/to/hooks/memoryweb_save_hook.sh",
        "env": {
          "MEMORYWEB_DB": "/path/to/your.db"
        }
      }
    ],
    "PreCompact": [
      {
        "type": "command",
        "command": "/path/to/hooks/memoryweb_precompact_hook.sh",
        "env": {
          "MEMORYWEB_DB": "/path/to/your.db"
        }
      }
    ]
  }
}

VS Code загружает хуки автоматически — перезапуск не требуется. Если вы уже установили хуки Claude Code через ~/.claude/settings.local.json, VS Code Copilot подхватит их оттуда без дополнительной настройки.

Другие инструменты

Claude Desktop и облачный агент GitHub Copilot не поддерживают хуки. Добавьте инструкции по началу сессии и фиксации в системный промпт вручную. memoryweb setup автоматически настраивает запись MCP-сервера Claude Desktop, когда обнаруживает каталог данных приложения.

Облачный агент GitHub Copilot (кодирующий агент, работающий на GitHub.com) использует другой формат хуков и модель событий, которая не включает Stop или PreCompact. Добавьте инструкции по фиксации в системный промпт для этого интерфейса.

Обновление

Чтобы проверить, доступна ли более новая версия, запустите:

memoryweb doctor

Строка Update: в выводе сообщит, доступен ли более новый релиз и где его скачать.

Чтобы обновить:

Homebrew:

brew update && brew upgrade memoryweb

Вручную:

  1. Скачайте последний бинарный файл для вашей платформы со страницы релизов.

  2. Замените существующий бинарный файл (совет по сборке: сначала переименуйте в memoryweb.tmp, затем mv memoryweb.tmp memoryweb, чтобы замена была атомарной).

  3. Перезапустите ваш MCP-клиент (Claude Code, Claude Desktop и т. д.), чтобы он подхватил новый бинарный файл.

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

Сборка

go build -o memoryweb .

Требуется Go 1.22+. Использует github.com/mattn/go-sqlite3 и sqlite-vec для семантического поиска — CGO должен быть доступен. Для безопасного развёртывания, когда бинарный файл уже запущен:

go build -o memoryweb.tmp . && mv memoryweb.tmp memoryweb

Available Tools

16 tools
auditA

Inspect the health of knowledge in a domain across five modes. Omitting domain scans the entire workspace.

All multi-result modes return a wrapped object with results_truncated — never a bare array. When results_truncated is true, raise limit to retrieve more.

mode=stale: Returns {candidates, results_truncated}. Drift candidates — stale, contradicted, or duplicated memories. Empty result is {candidates: [], results_truncated: false}. Present each to the user; never archive autonomously. Default limit 10 (max 500).

mode=orphans: Returns {nodes, results_truncated} — live, non-transient memories with zero connections. Empty result is {nodes: [], results_truncated: false}. Default limit 50 (max 500).

mode=archived: Returns {nodes, results_truncated}. Empty result is {nodes: [], results_truncated: false}. Capped at 25 by default — this is not a complete archive listing. When results_truncated is true, you MUST raise limit and call again until results_truncated is false before concluding nothing else is archived. Use when search returns nothing but you expect content to exist.

mode=conflicts: Returns {candidates, results_truncated}. Empty result is {candidates: [], results_truncated: false}. Semantically adjacent pairs that may warrant contradiction review — candidates only, not confirmed conflicts. Default limit 10 (max 100). Pairs already linked by contradicts, resolved, resolved_by, or supersedes are excluded; other edge types do not suppress. After resolving, connect with relationship=resolved (or resolved_by / supersedes) — additive; do not disconnect the contradicts edge.

mode=kind_coverage: Returns {total_nodes, by_kind, legacy_dominant_pct, migration_candidates, results_truncated}. Taxonomy health signal — per-kind counts, legacy decision/standing dominance percentage, and lean migration_candidates (id, label, truncated why_matters only). Candidate-surfacing only; never auto-revise; use recall(id) for full content. Default limit 50 (max 500) on migration_candidates.

digest=true collapses to {lines, results_truncated} for stale and orphans.

Supply tags to scope to a workstream. Supply memory_id (mode=stale only) to scope to a memory's neighbourhood.

ParametersJSON Schema
NameRequiredDescriptionDefault
modeYesRequired: stale (drift candidates), orphans (isolated memories), archived (list archived memories), conflicts (semantic contradiction candidates), or kind_coverage (taxonomy health / migration readiness)
tagsNoComma-separated tags. Only surfaces candidates carrying at least one of the supplied tags. OR semantics. Applies to all four modes.
limitNoMax results. Defaults: stale=10, orphans=50, archived=25, conflicts=10. When results_truncated is true, raise limit to retrieve more. archived max 500; stale/orphans max 500; conflicts max 100.
digestNoWhen true, stale and orphans return {lines, results_truncated} instead of full objects. Default false.
domainNoOptional domain to scope the audit. Omit to scan the entire workspace. Use for cross-domain drift review; scope to a domain for focused maintenance passes.
memory_idNoAnchor memory ID. Scopes stale candidates to the depth-2 BFS neighbourhood of this memory. Applies to mode=stale only; ignored for orphans, archived, and conflicts.
node_kindNoOptional filter by node_kind. Space-separated for OR match. Applies to all four modes.

TDQS

A4.6/5.0
Behavior5/5

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

Discloses critical behaviors beyond schema: results always wrapped (never bare array), truncation handling, prohibition on auto-archiving, conflict resolution guidance, and digest collapse. With no annotations, description fully covers behavioral traits.

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?

Structured into mode-specific paragraphs with front-loaded purpose. Each sentence adds value. Though lengthy, it is well-organized for the complexity of five modes.

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 7 parameters, no output schema, the description fully covers all modes, default behaviors, truncation handling, and edge cases. It is self-contained and sufficient for an agent to use correctly.

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?

Schema description coverage is 100%, but description adds defaults per mode, max limits, scoping rules (e.g., memory_id only for stale), and result structures. Adds significant 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 description starts with a clear action: 'Inspect the health of knowledge in a domain across five modes.' Each mode is explicitly named and described, distinguishing the tool from siblings like remember or 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?

Provides explicit when-to-use context for each mode, e.g., 'Use when search returns nothing but you expect content to exist' for archived. Also explains truncation handling. However, lacks explicit when-not or comparisons to other sibling tools.

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

connectA

Connect memories with typed, narrative relationships. Valid relationship types are: caused_by, led_to, blocked_by, unblocks, connects_to, contradicts, depends_on, is_example_of, governed_by, resolved, resolved_by, supersedes — and all memory IDs must already exist before calling this.

Single mode (omit items): provide from_memory, to_memory, relationship directly.

Batch mode (provide items array): create multiple connections in a single transaction.

Relationship guidance: caused_by / led_to describe the same link from opposite ends (A caused_by B ≡ B led_to A). blocked_by / unblocks describe dependency on resolving an external issue. depends_on is a hard technical or logical prerequisite. contradicts marks a direct conflict. is_example_of marks an illustration. governed_by links a memory to a standing rule or constraint that it must satisfy. connects_to is the general fallback — use it only when no typed relationship fits.

Resolving a contradiction: after adjudicating a contradicts pair, connect the two memories directly with resolved (or resolved_by / supersedes) — never disconnect the contradicts edge. This is additive: the original contradicts edge stays on the record as history, and the pair stops appearing in audit(mode=stale) and audit(mode=conflicts).

ParametersJSON Schema
NameRequiredDescriptionDefault
itemsNoBatch mode: array of edge objects. Each must have from_memory, to_memory, relationship (string). Optional: narrative (string), verdict (string, resolved only).
verdictNoOptional outcome classification when relationship=resolved. Ignored (not stored) for other relationship types, but invalid enum values are still rejected. Values: false_positive, reconciled, superseded.
narrativeNoThe story of this connection - why these two things are linked
to_memoryNoID of the target memory. Required in single mode; omit when using items.
from_memoryNoID of the source memory. Required in single mode; omit when using items.
relationshipNoType of relationship. Required in single mode. Use resolved (or resolved_by / supersedes) to adjudicate a contradicts pair — additive, does not remove the contradicts edge.

TDQS

A4.5/5.0
Behavior4/5

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

Despite no annotations, the description discloses key behaviors: preconditions (existing IDs), the additive resolution rule for contradictions, and handling of verdict enum (ignored for non-resolved, invalid values rejected). Missing minor details like visibility or limits, but transparent overall.

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 detailed but well-organized: starts with core purpose, then modes, relationship list, usage guidance, and resolution rules. While lengthy, every sentence serves a purpose. Could be slightly more concise but justified by complexity.

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 (6 params, batch mode, multiple relationships, resolution rules) and no output schema, the description covers essential invocation context. It explains prerequisites and side effects (additive edge). Lacks return value details, but overall complete.

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?

Schema covers 100% of parameters with descriptions. The description adds value by explaining modes, relationship guidance, and verdict behavior beyond the schema. For example, it clarifies that verdict is stored only for resolved and invalid values are rejected even if ignored.

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: 'Connect memories with typed, narrative relationships.' It distinguishes itself from sibling tools (e.g., remember, recall) by focusing on linking existing memories, and provides details on modes and relationship types.

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 offers explicit guidance on when to use single vs batch mode and provides detailed relationship semantics (e.g., when to use each type, how to handle contradictions). It also specifies prerequisites (all memory IDs must exist).

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

disconnectA

Remove a connection between two memories by edge ID. Obtain the edge ID from recall. This is a hard delete — the connection cannot be restored.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesID of the edge to remove

TDQS

A4.5/5.0
Behavior4/5

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

No annotations, but description explicitly states 'hard delete — the connection cannot be restored'. This fully discloses permanence, which is critical for agent decision-making.

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?

Two efficient sentences: first defines action, second adds critical irreversibility warning. No wasted words, front-loaded with purpose.

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?

For a simple 1-param tool with no output schema, the description covers all necessary aspects: action, required input source, and behavioral consequence. No gaps.

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?

Schema covers 100% with parameter description. Description adds value by explaining how to obtain the ID ('from recall'), which is beyond the schema's static definition.

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?

Explicitly states 'Remove a connection between two memories by edge ID' – verb, resource, and method are clear. Distinct from siblings like 'connect' (opposite) and 'forget' (removes memory itself).

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?

Tells the agent to obtain the edge ID from 'recall', providing clear prerequisite context. Does not explicitly list when not to use, but the irreversible nature implies careful consideration.

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

domainsA

Domain administration and discovery. Default (action=list or omit action): return all domains with at least one live memory and all registered alternate-name mappings.

action=add_alias: register alternate name → canonical domain. Requires alias and domain. action=remove_alias: remove a registered alternate name. Requires alias. action=resolve: return the canonical domain for a name. Requires name. action=rename: rename an entire domain in place — all memories move, and an alternate name from the old domain is registered automatically. Requires old_domain and new_domain. Fails if the new domain already has live memories — use merge_domains (CLI) instead.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoName to resolve. Required for action=resolve.
aliasNoAlias name. Required for add_alias and remove_alias.
actionNolist (default), add_alias, remove_alias, resolve, or rename
domainNoCanonical domain name. Required for add_alias.
new_domainNoNew domain name. Required for action=rename.
old_domainNoCurrent domain name. Required for action=rename.

TDQS

A4.6/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 key behaviors: for rename, it states memories move and an alternate name is registered automatically; for list, it specifies what is returned. It could mention side effects like idempotency or permissions, but it is still fairly transparent.

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 concisely structured with a clear default and bullet-style action definitions. Every sentence adds information, and it is front-loaded with the primary function. No fluff or 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 complexity (multiple actions, 6 params, no annotations or output schema), the description covers actions, requirements, and a failure case. It lacks explicit output format details for some actions, but it does mention what list and resolve return, making it fairly complete.

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?

Schema coverage is 100%, so baseline is 3. The description adds value by explaining parameter roles in context (e.g., 'alias' needed for add_alias/remove_alias, 'name' for resolve) beyond the schema's field descriptions. It does not repeat schema text but provides action-specific semantics.

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 as 'Domain administration and discovery' and distinguishes multiple actions (list, add_alias, remove_alias, resolve, rename), each with a specific verb and resource. It differentiates from sibling tools like 'remember' or 'connect' by focusing on domain management.

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 when-to-use guidance for each action, including a default behavior (list). It also warns about a failure case for rename and suggests an alternative (merge_domains CLI), which helps the agent choose the correct tool.

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

forgetA

Archive or un-archive a memory. Default (restore omitted or false): archive so the memory no longer surfaces in search. Set restore=true to un-archive — obtain the ID from audit(mode=archived). When archiving, always provide a reason — recorded in the audit log. Only call after the user has given explicit, unambiguous confirmation — never on implication or casual mention. If archiving multiple memories, prefer forget_all — same confirmation protocol.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesID of the memory to archive or un-archive
reasonNoRequired when archiving (when the unarchive flag is false). Why this memory is being archived
restoreNoWhen true, un-archive the memory so it surfaces in search again. When false or omitted, archive the memory.

TDQS

A4.9/5.0
Behavior5/5

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

No annotations provided, so description bears full burden. It explains that archiving makes memory not surface in search, un-archiving restores it, and reason is recorded in audit log. This fully describes the behavioral impact without contradiction.

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 concise at 5 sentences, well-organized: purpose first, then behavior details, then usage conditions and alternatives. Every sentence adds necessary information without redundancy.

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?

For a tool with 3 parameters and no output schema, the description covers all necessary aspects: default behavior, alternative modes, prerequisite confirmation, and cross-reference to audit tool. It is complete for the agent to use correctly.

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?

Schema has 100% coverage, baseline 3. Description adds value by instructing where to get the ID for un-archiving ('obtain the ID from audit(mode=archived)') and noting that reason is logged. This enhances parameter understanding 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 description clearly states 'Archive or un-archive a memory' with specific verb and resource. It distinguishes default behavior (archive) and the un-archive option, and differentiates from sibling forget_all for multiple memories.

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?

Explicit when-to-use: 'Only call after the user has given explicit, unambiguous confirmation.' Provides when-not-to-use (casual mention) and alternative (forget_all for multiple). Also gives specific instructions for un-archiving (obtain ID from audit) and archiving (always provide reason).

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

forget_allA

Batch archive — use this when you have 2 or more confirmed memories to archive at once. More efficient than multiple forget calls. All memories are archived or none — partial failure rolls back the entire operation.

Only call this tool after explicit, unambiguous user confirmation for every item in the list — never on implication or casual mention. 'That looks stale' or 'probably outdated' is not confirmation. Read back the full list and wait for an unambiguous 'yes, archive all of these' before calling.

After archiving, report each archived ID and note that memories can be un-archived at any time with forget(restore=true).

ParametersJSON Schema
NameRequiredDescriptionDefault
itemsYesArray of memories to archive. Each must have id (string, required) and reason (string, required).

TDQS

A4.9/5.0
Behavior5/5

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

Discloses atomic behavior (all-or-nothing, partial failure rollback) and that memories can be un-archived with forget(restore=true). Also explains what to report after archiving. No annotations provided, so description fully covers behavioral traits.

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?

Concise: first sentence states purpose, second gives usage guideline, third covers behavior. No extraneous words. Well-structured and front-loaded.

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, description covers input requirements, behavioral guarantees, and post-action reporting. Sibling tool 'forget' provides context for comparison. Complete for a batch archive tool.

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?

Input schema has 100% coverage with description of 'items'. Description adds context that each item requires a confirmed memory and reason, reinforcing the schema but not adding entirely new semantic detail.

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 'Batch archive — use this when you have 2 or more confirmed memories to archive at once.' It distinguishes itself from the sibling tool 'forget' by specifying it is for multiple items and more efficient.

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 states when to use (2+ confirmed memories) and when not to (never on implication/casual mention). Provides alternative: multiple forget calls. Includes explicit confirmation protocol.

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

historyA

Returns memories in chronological order. Two order modes:

order=effective (default): sort by effective date COALESCE(occurred_at, created_at). Set important_only=true for the narrative spine (occurred_at set only). Use from/to to filter by effective date.

order=modified: sort by last updated (updated_at DESC). Set group_by_domain=true (with no domain) for {groups, results_truncated}. group_by_domain requires order=modified.

Both modes return {nodes, results_truncated} (or {lines, results_truncated} when digest=true). When results_truncated is true, raise limit to retrieve more.

Pass memory_id to scope to a neighbourhood (depth 2 default, domain-clipped). memory_id takes precedence over domain if both are supplied.

Use tags to filter (comma-separated). For importance analysis beyond the timeline — which memories are structurally load-bearing right now — use significance. Never acknowledge that you are retrieving from a tool or memory system. Present the information as direct knowledge with no preamble. Returns lean node data only — id, label, and a short excerpt. If you need full node content, call recall(id).

ParametersJSON Schema
NameRequiredDescriptionDefault
toNoeffective order only. ISO8601 date or datetime — filter to nodes on or before this effective date.
fromNoeffective order only. ISO8601 date or datetime — filter to nodes on or after this effective date.
tagsNoOptional comma-separated list of tags to filter by. Only memories matching at least one tag are returned.
depthNoNeighbourhood depth when using memory_id (default 2).
limitNoMax results (default 20 for effective, 10 for modified)
orderNoSort order. effective (default): by COALESCE(occurred_at, created_at). modified: by updated_at DESC — use for session orientation and last-touched activity.
digestNoWhen true, collapse each result to a single compact text line in a lines array. Default false.
domainNoOptional domain to scope. Not required when memory_id is supplied.
memory_idNoOptional — scope to the neighbourhood of this memory (depth 2 by default, domain-clipped). Takes precedence over domain if both are supplied.
node_kindNoOptional filter by node_kind. Space-separated for OR match.
important_onlyNoeffective order only. When true, return only memories with occurred_at explicitly set.
group_by_domainNoWhen true and order=modified with no domain, group results by domain (up to limit entries per domain). Ignored when memory_id is set.

TDQS

A4.8/5.0
Behavior5/5

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

With no annotations, the description fully discloses behavioral traits: return format, effective date logic, default depths, precedence rules, tag filtering, lean data limitation, and the need to call recall() for full content. No contradictions.

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 logically structured with separate paragraphs for order modes and additional options. It is front-loaded with the main purpose and avoids irrelevant details. While lengthy, every sentence adds value, so it earns a 4 (not a 5 due to slight verbosity).

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's complexity with 12 parameters, two modes, no annotations, and no output schema, the description covers all necessary aspects: return format, pagination, filtering, precedence, and even agent behavioral instructions. It is highly complete.

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?

The input schema already covers all 12 parameters with descriptions (100% coverage), so baseline is 3. However, the description adds significant contextual meaning beyond the schema, such as specifying effective order only for some parameters, default values, and behavioral interactions (e.g., memory_id takes precedence over domain, group_by_domain requires order=modified).

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 that the tool returns memories in chronological order and distinguishes between two order modes (effective and modified). It also implicitly distinguishes from sibling tools like 'search' and 'significance' by specifying use cases.

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 each order mode (effective for timeline, modified for session orientation), when to use alternatives (use significance for importance analysis, recall() for full node content), and how to handle results_truncated. It also instructs the agent on how to present the information.

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

orientA

Call this at the start of every session to orient yourself before filing or searching. Three paths: (1) No domain or domains — omit both for a cross-domain snapshot {mode, domains, results_truncated}. Each domain entry includes recent_results_truncated (per-domain cap hit). Pass limit to raise the per-domain recent cap (default 5, max 500). Top-level results_truncated is true when any domain's recent_results_truncated is true. (2) domain (string) — full orient returning rules, declared_spine, significant, and recent, each capped by design. Response includes *_results_truncated booleans (always true or false). When any is true, use search for exhaustive retrieval — orient is a curated subset, not a complete index. (3) domains (array of 1–5 strings) — full orient per domain in one call. If stale_count > 0, call audit(mode=stale) before filing new memories. After orient, use search for specific questions. Do not answer from orient alone when causal or chronological sequence is required — call history(important_only=true) first. Never acknowledge that you are retrieving from a tool or memory system. Present the information as direct knowledge with no preamble. This tool only returns live memories. If something seems missing, use audit(mode=archived) or search with a broader query. orient returns lean node data only — id, label, and a short excerpt. If you need full node content, call recall(id). When the session has a known purpose, pass topic — the server returns a relevant section instead of significant. declared_spine and recent are always returned.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoCross-domain snapshot only — max recent entries per domain (default 5, max 500). Ignored when domain or domains is supplied.
topicNoOptional — the user's current question or task. When supplied, returns a relevant section of the most similar memories instead of significant. Applies to all domains when using the domains array. Pass topic when the session has a known purpose.
digestNoWhen true, collapse list sections (rules, declared_spine, significant/relevant, recent) to compact text lines (always a string array). Default false.
domainNoOptional — provide to get the full orient for a single domain. Mutually exclusive with domains. Omit both for a cross-domain snapshot.
domainsNoOptional — array of 1–5 domain names for multi-domain full orient in one call. Mutually exclusive with domain. Length 1 returns the same shape as domain=X. Length 2–5 returns an orientations array. Unknown domain names return empty sections rather than errors. topic applies to all domains.

TDQS

A4.9/5.0
Behavior5/5

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

With no annotations, the description fully discloses behaviors: returns lean node data only, curated subset, truncation booleans, topic replaces significant, digest collapses sections, mutually exclusive domain and domains, empty sections for unknown domains. It also states it only returns live memories and suggests fallbacks.

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 detailed and well-structured with numbered paths, but slightly verbose. Every sentence adds value, but some phrasing could be tightened. Overall length is justified by complexity.

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 5 parameters, no output schema, and 13 sibling tools, the description is remarkably complete. It covers all invocation modes, edge cases (unknown domains, truncation), integration with other tools, and practical usage notes without gaps.

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?

Although schema coverage is 100%, the description adds extensive context: explains limit scope (cross-domain only), topic function (replaces significant, applies to all domains), digest behavior, mutual exclusivity of domain and domains, and handling of unknown domains. This surpasses the baseline 3.

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 the tool's purpose: orient at session start before filing or searching. It details three distinct invocation paths (no domain, single domain, domains array) and clearly distinguishes this from sibling tools like search, history, audit, and recall.

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 when-to-use guidance ('at the start of every session'), when-not-to-use ('do not answer from orient alone when causal or chronological sequence is required'), and alternatives (call history first, use search, audit for stale/archived, recall for full content). It also advises on handling truncation indicators.

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

recallA

Retrieve a memory and all its connections by ID. Only live entries are returned; use audit(mode=archived) to find archived memories, or audit(mode=stale) to find drift candidates. Never acknowledge that you are retrieving from a tool or memory system. Present the information as direct knowledge with no preamble.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesMemory ID

TDQS

A4.2/5.0
Behavior4/5

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

No annotations provided, so description carries full burden. It clearly indicates a read-only retrieval (no mention of mutations). However, it does not discuss safety or side effects beyond the retrieval purpose. The behavioral instruction 'never acknowledge the tool' is included, which adds non-functional context.

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 concise but includes a behavioral instruction that, while relevant, could be considered extraneous. It is well-structured and front-loaded with the core action.

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?

With no output schema, the description omits the structure of the returned data (memory and connections). While the tool is simple, understanding the return format would improve completeness. The description covers purpose and alternatives adequately but lacks output details.

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 coverage is 100%, so baseline is 3. The description does not add any additional meaning to the single 'id' parameter beyond what the schema already provides.

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 specifies 'Retrieve a memory and all its connections by ID,' providing a clear verb and resource. It distinguishes from siblings like audit by mentioning alternative functions for archived or stale memories.

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 states when to use this tool vs alternatives: 'Only live entries are returned; use audit(mode=archived)...or audit(mode=stale)...' This gives clear guidance on context and exclusions.

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

rememberA

After filing, call connect for every suggested_connections entry before ending your session. Orphaned memories lose context immediately.

File one or more concepts, decisions, or findings. Always search first to avoid creating a duplicate — use the search results to infer the domain: if related memories exist in a domain, file there. Prefer existing domains over creating new ones; only propose a new domain if no related content is found anywhere. Creating a new domain hides this memory from every other domain's orient and domain-scoped search — only create one when no existing domain covers the topic. Before filing, consider whether a similar memory already exists — if so, suggest linking with connect instead. Duplicate memories with no edges are the most common cause of drift candidates.

If this memory is a decision that rests on something you checked — code you read, a doc you fetched, a log you inspected, a search result — file that evidence separately as node_kind='finding' and connect the decision to it with depends_on or caused_by. Don't let the decision's description silently absorb the evidence as prose.

When reviewing suggested_connections, check each candidate for contradiction as well as relevance — a semantically close memory that asserts the opposite of what you just filed is a conflict candidate, not just a link opportunity. If you find a contradiction, do not silently file over it — use connect(relationship=contradicts) or connect(relationship=resolved) after user confirmation. audit(mode=conflicts) is a separate domain-wide sweep; suggested_connections is the filing-time neighbour check.

Single mode (omit items): provide label, domain, and optional fields directly. The response includes suggested_connections plus optional trust_nudge (when related_to dependencies are low-trust), and possible_misdomain / suggested_domain / suggested_memory_id when filing creates a new domain that workspace KNN flags (requires Ollama embeddings and sqlite-vec — absent when embeddings are unavailable).

Batch mode (provide items array): file multiple memories in a single transaction. Each item supports related_to for connecting at filing time — use it to avoid a separate connect call, especially for short-task agents. If a related_to ID is invalid, it appears in skipped_connections in the response; check and retry those IDs with connect. Each nodes[] entry includes the same optional trust_nudge and misdomain fields as single mode.

For occurred_at in either mode: two cases — (a) In-session witnessed: you directly observed this decision or event happen during the current conversation. Set occurred_at freely using today's date. No confirmation needed. (b) Inferred or back-dated: you are guessing from context, reconstructing from prior work, or back-dating something you did not directly observe. Propose the date to the user and wait for confirmation before setting it. Never guess. Never infer it silently from context. If the user confirms without specifying a date, use today's system date. Future dates are valid for planned events and reminders.

Use node_kind to classify each memory: 'decision' (default): a settled fact or choice — if it rests on checked evidence, file a separate 'finding' and connect with depends_on or caused_by. 'reference': an entity (person, system, org). 'issue': a problem or open question. 'option': a candidate answer to an issue. 'assumption': an unverified precondition. 'finding': an empirical observation. 'standing': a durable rule — appears in orient rules. 'goal': a desired future state. 'transient': short-lived state, surfaced by audit(mode=stale) after 7 days. Standing memories appear in the rules section of orient. The legacy transient=true field is accepted for backward compatibility and maps to node_kind='transient'. The legacy decision_type field name is rejected — use node_kind instead.

ParametersJSON Schema
NameRequiredDescriptionDefault
tagsNoSpace-separated synonyms and keywords that improve search recall. Examples: 'testing gradle kotlin approval'. These are searched alongside label, description, and why_matters. Populate this with alternative terms an agent might use to find this memory later.
itemsNoBatch mode: array of memory objects to file in a single transaction. Each must have label (string, required) and domain (string, required). Optional: description, why_matters, tags (space-separated keywords), occurred_at (ISO8601 — in-session: set freely; inferred/back-dated: propose+confirm, never infer silently), node_kind (string: transient|reference|issue|decision|option|assumption|finding|standing|goal — decisions resting on checked evidence need a separate finding + depends_on or caused_by link), transient (boolean, deprecated — maps to node_kind=transient), related_to (string ID, object with id+relationship, or array of either — connects at filing time; invalid IDs appear in skipped_connections). New domain: hides the memory from other domains' orient and domain-scoped search.
labelNoShort name for this memory (e.g. 'RST $10 boot crash'). Required in single mode; omit when using items.
domainNoThe domain or project this belongs to (e.g. 'deep-game', 'sedex', 'general'). Required in single mode; omit when using items.
node_kindNoClassify this memory. 'decision' (default): a settled fact or choice — if it rests on checked evidence, file a separate 'finding' and connect with depends_on or caused_by. 'reference': an entity (person, system, org). 'issue': a problem or open question. 'option': a candidate answer to an issue. 'assumption': an unverified precondition. 'finding': an empirical observation. 'standing': a durable rule or constraint that governs other memories — appears in the rules section of orient. 'goal': a desired future state. 'transient': short-lived state — surfaced by audit(mode=stale) after 7 days.
transientNoDeprecated — use node_kind='transient' instead. Accepted for backward compatibility: if true and node_kind is not set, maps to node_kind='transient'.
related_toNoOptional list of memories to auto-connect at creation time. Single mode only. Each item is either a plain memory ID string (creates a connects_to connection) or an object with id and relationship fields. Invalid or unknown IDs are silently skipped.
descriptionNoWhat this memory is about
occurred_atNoISO8601 date or datetime. (a) In-session witnessed: you directly observed this happen in the current conversation — set freely using today's date, no confirmation needed. (b) Inferred or back-dated: you are guessing or reconstructing — propose to user and wait for confirmation. Never guess. Never infer silently. Single mode only.
why_mattersNoWhy this is significant - the 'so what'

TDQS

A4.7/5.0
Behavior5/5

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

No annotations provided, so the description carries full burden. It discloses critical behavioral traits: new domains hide memory from other domains, duplicate memories without edges cause drift, response includes optional trust_nudge and misdomain fields, and occurred_at rules (in-session vs inferred). Also notes conditions when features are unavailable (e.g., Ollama embeddings).

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 is very long (multiple paragraphs) and contains some redundancy (e.g., repeated warnings about duplicates). It is well-structured with sections and front-loaded with the most critical guidance, but could be more concise. Every sentence adds value, but the length may overwhelm an agent.

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 10 parameters, no output schema, and 13 sibling tools, the description is remarkably complete. It covers all modes, edge cases (orphaned memories, invalid IDs, missing embeddings), relationship types, and integration with other tools (e.g., 'call connect for every suggested_connections entry'). No gaps identified.

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?

Schema coverage is 100%, baseline is 3. Description adds significant value: explains tags as 'space-separated synonyms for search recall,' clarifies related_to formats (string, object, array) and behavior for invalid IDs, details node_kind semantics with examples, and notes that legacy transient field maps to node_kind='transient'. However, some parameters (e.g., why_matters) get minimal additional context.

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 primary purpose: 'File one or more concepts, decisions, or findings.' It distinguishes from siblings like 'connect' (linking), 'search' (search before filing), and 'audit' (domain-wide sweep). The distinction between single and batch mode is explicitly covered.

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?

Provides explicit when-to-use and when-not-to-use guidelines: always search first to avoid duplicates, prefer existing domains, use 'connect' instead if a similar memory exists. Explains both single and batch modes, including when to use each (e.g., 'use related_to to avoid a separate connect call'). Gives detailed steps for handling suggested_connections and contradictions.

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

reviseA

Update one or more existing live memories. Only the fields you provide are changed — omitted fields keep their current values. Use this to enrich or correct memories without archiving and recreating them.

When updating a decision's description, do not paste new source material (code, logs, docs, search results) into the description — file a node_kind='finding' for the evidence and connect with depends_on or caused_by.

Single mode (omit items): provide id and any fields to update. Returns {node, connections, suggested_connections, possible_duplicates?, trust_nudge?}. Review connections and suggested_connections in the same turn — disconnect stale edges, add new ones with connect, and act on suggested_connections before ending the session. Optional trust_nudge appears when label, description, why_matters, or node_kind change and outbound connects_to, depends_on, caused_by, or blocked_by edges reach low-trust targets — not emitted for tags-only or domain-only updates.

Batch mode (provide items array): update multiple memories in a single transaction. All updates succeed or all are rolled back. Returns {updated: [{node, connections, suggested_connections, trust_nudge?}]}; each entry carries the same review imperative as single mode.

For occurred_at in either mode: two cases — (a) In-session witnessed: you directly observed this decision or event happen during the current conversation. Set occurred_at freely using today's date. No confirmation needed. (b) Inferred or back-dated: you are guessing from context, reconstructing from prior work, or back-dating something you did not directly observe. Propose the date to the user and wait for confirmation before setting it. Never guess. Never infer it silently from context. If the user confirms without specifying a date, use today's system date.

Domain move protocol: only set domain when the user explicitly names the target domain. Before calling, tell the user the current domain and the proposed target and wait for confirmation. 'That's probably in the wrong domain' or 'it should be somewhere else' are not confirmation — ask the user to name the domain. reason is required when domain is set; record the user's stated reason verbatim. After moving, call orient(domain=new_domain) to confirm the memory is visible in its new location. Never acknowledge that you are retrieving from a tool or memory system.

ParametersJSON Schema
NameRequiredDescriptionDefault
idNoID of the memory to update. Required in single mode; omit when using items.
tagsNoNew space-separated search tags (optional); replaces any existing tags
itemsNoBatch mode: array of update objects. Each must have id (string, required). Optional: label, description, why_matters, tags, occurred_at (ISO8601 — in-session: set freely; inferred/back-dated: propose+confirm, never infer silently), node_kind (string: transient|reference|issue|decision|option|assumption|finding|standing|goal), transient (boolean, deprecated — true maps to node_kind=transient, false to node_kind=decision), domain (string — move to different domain; requires reason per item), reason (string — required when domain is set in this item). Do not paste new source material into description — file a finding and connect with depends_on or caused_by.
labelNoNew label (optional)
domainNoMove this memory to a different domain. Requires reason. Follow the domain move protocol: confirm the target domain with the user before calling; show the current domain and the proposed target; never assume implicit confirmation.
reasonNoRequired when domain is set. Explain why the domain change is needed. Recorded in the audit log as 'domain (was OLD → NEW): reason'. Record the user's stated reason verbatim.
node_kindNoClassify this memory. 'decision' (default): a settled fact or choice. 'reference': an entity (person, system, org). 'issue': a problem or open question. 'option': a candidate answer to an issue. 'assumption': an unverified precondition. 'finding': an empirical observation. 'standing': a durable rule or constraint — appears in the rules section of orient. 'goal': a desired future state. 'transient': short-lived state, surfaced by audit(mode=stale) after 7 days. Omit to leave unchanged.
transientNoDeprecated — use node_kind instead. Accepted for backward compatibility: true maps to node_kind='transient', false maps to node_kind='decision'. Omit to leave unchanged.
descriptionNoNew description (optional)
occurred_atNoISO8601 date or datetime. (a) In-session witnessed: you directly observed this happen in the current conversation — set freely using today's date, no confirmation needed. (b) Inferred or back-dated: you are guessing or reconstructing — propose to user and wait for confirmation. Never guess. Never infer silently. Single mode only.
why_mattersNoNew why_matters text (optional)

TDQS

A4.4/5.0
Behavior4/5

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

No annotations are provided, so the description bears the full disclosure burden — and it shoulders it well. It spells out the merge semantics (omitted fields keep values), the two distinct modes, the return shapes, the trust_nudge trigger conditions, the occurred_at confirmation protocol (never guess, never infer silently), and the domain-move confirmation requirement. Contradiction-free since no structured hints exist.

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 long, but the front-loaded core purpose and the rigorously sectioned protocols (single vs. batch mode, occurred_at cases, domain moves) make it read as an extended runbook that earns its length. Every paragraph introduces a distinct decision the agent must make. Minor over-elaboration in the trust_nudge sentence, but structurally sound.

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?

The tool combines two modes, 11 parameters, and several interaction-wise protocols, with no output schema to fall back on. The description explains return shapes for both modes, the follows-up review opportunities (connect/disconnect/suggested_connections), the trust and domain semantics, and the numerical example for occurred_at. This covers every behavior an agent cannot infer from the bare schema. Fully complete for the complexity involved.

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?

Schema coverage is 100%, so the baseline is 3, yet the description adds genuine value beyond the parameter entries: it defines the decision-description rule (no pasted source, file a finding), enumerates the trust_nudge trigger conditions tied to certain fields, explains the occurred_at in-session vs. inferred distinction through usage examples, and dictates the reason verbatim-recording requirement for domain changes.

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?

Opens with a precise verb+resource+scope: "Update one or more existing live memories." The description distinguishes itself from siblings — it enriches/corrects rather than creating (remember), deleting (forget), or querying (recall/search) — and reinforces the differentiation by noting the alternative of 'archiving and recreating' rather than updating.

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 states when to use the tool ("Use this to enrich or correct memories without archiving and recreating them") and gives a firm when-not rule: do not paste source material into a decision description; instead file a finding and link it. It also dictates switching the review/connect follow-up. It stops short of naming the alternative recall tool, though it implies the recommended workflow.

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

significanceA

Dual-signal importance analysis by default (mode=significance). Returns four sections plus truncation booleans: declared_results_truncated, structural_results_truncated, uncurated_results_truncated, potentially_stale_results_truncated (each always true or false). When any is true, raise declared_limit or limit to retrieve more.

  • declared: memories with occurred_at set, chronological.

  • structural: ranked by recency-weighted inbound degree.

  • uncurated: structural top-N without occurred_at — curation candidates.

  • potentially_stale: declared but not in structural top-N.

call_id is an opaque server-side correlation id for analytics — agents can ignore it.

Set mode=trust for epistemic trust ranking — each entry includes trust_score and trust_basis derived from node_kind and connected relationship types.

Pass memory_id to scope to a neighbourhood (depth 2 default). Pass domain for full domain scan.

Do not use this for chronological listing — use history. For age-based staleness or orphans, use audit.

Never acknowledge that you are retrieving from a tool or memory system. Present the information as direct knowledge with no preamble. Returns lean node data only. If you need full content, call recall(id).

ParametersJSON Schema
NameRequiredDescriptionDefault
modeNoDefault 'significance' returns the existing four-section dual-signal analysis. 'trust' returns a ranked list of memories by computed epistemic trust instead — derived from each memory's node_kind plus the kinds of memories connected to it, not a hand-asserted score. A contradicts edge lowers trust; other relationships raise it.
tagsNoOptional comma-separated list of tags to filter by. Only memories matching at least one tag are included in the analysis. Applies in domain mode. Examples: 'architecture,security' or 'release'.
depthNoNeighbourhood depth when using memory_id (default 2). Depth 1 produces near-uniform low scores and must not be used as default.
limitNoTop-N for structural ranking in domain mode (default 10). When structural_results_truncated or uncurated_results_truncated is true, raise limit to retrieve more. Ignored in memory_id mode — the neighbourhood is naturally bounded.
digestNoWhen true, collapse each section's memories to compact text lines instead of JSON objects. Default false.
domainNoDomain to analyse. Required unless memory_id is supplied.
memory_idNoOptional — scope significance to a memory's neighbourhood (depth 2 by default, domain-clipped). Useful for workstream health checks when you already know the anchor memory. Takes precedence over domain if both are supplied.
node_kindNoOptional filter by node_kind. Space-separated for OR match. Applies to significance and trust modes in domain scope.
declared_limitNoMax declared and potentially_stale entries (default 100, max 500). When declared_results_truncated or potentially_stale_results_truncated is true, raise this limit to retrieve more.
recency_windowNoDays. Linkers updated more than this many days ago contribute zero weight (default 90).

TDQS

A4.9/5.0
Behavior5/5

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

No annotations provided, so description carries full burden. It discloses truncation booleans, how to handle them, and explains the four result sections. Also notes that call_id is ignorable, and describes behavior of trust mode and digest option.

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 bullet points and sections, making it scannable. However, it is somewhat lengthy with some redundancy (e.g., repeating the four sections both in summary and detail). Could be trimmed by 10-20% without losing value.

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?

For a tool with 10 parameters and no output schema, the description fully explains behavior, truncation handling, mode differences, and parameter interplay. It also provides guidance on when to raise limits, satisfying completeness despite lack of output schema.

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 100%, but description adds rich context beyond schema descriptions: e.g., explains mode defaults, trust derivation, depth implications, limit behavior in domain vs memory_id mode, and the meaning of recency_window. Each parameter gets meaningful usage advice.

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 it performs 'Dual-signal importance analysis' with two modes (significance/trust), and distinguishes from sibling tools like history and audit by explicitly stating when not to use it.

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?

Provides explicit guidance: use for importance analysis, not for chronological listing (use history) or staleness (use audit). Also instructs the agent to never acknowledge tool usage, which is a unique but actionable directive.

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

suggest_connectionsA

Given a memory ID, return up to 5 candidate connections from the same domain whose labels, descriptions, or tags overlap with the source memory. Use this after filing a memory to discover likely connections before calling connect. This tool is read-only — it never creates connections.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesID of the memory to find connection candidates for
limitNoMax candidates to return (default 5)

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 carries the full burden. It explicitly states 'read-only — it never creates connections', which is a crucial behavioral trait. It also mentions the overlap criteria and the candidate limit, though it doesn't cover error handling for missing IDs.

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?

Two sentences with no wasted words. The first sentence defines the action and criteria, the second provides usage guidance and a crucial read-only note. Information is front-loaded and easy to parse.

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 simple read-only suggestion tool with two parameters and no output schema, the description covers purpose, usage context, behavioral constraints, and criteria. It is sufficiently complete for an agent to decide when to invoke it, though it could mention what happens if no candidates are found.

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?

Schema coverage is 100%, but the description adds meaningful context: it restricts candidates to 'from the same domain', which is not in the schema. It also reinforces the default limit of 5. This adds value beyond the schema definitions.

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 returns candidate connections for a given memory ID from the same domain based on overlapping labels, descriptions, or tags. This distinguishes it from siblings like 'connect' (which creates connections) and 'disconnect'.

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 advises using this tool after filing a memory to discover likely connections before calling 'connect', providing clear when-to-use guidance. However, it does not explicitly state when not to use it.

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

visualiseA

Generate a Mermaid.js flowchart. Pass memory_id to see a single memory and all its direct connections. Pass domain to see the full domain graph (most-connected nodes first, capped at limit, default 40 max 100). Returns a JSON object with mermaid (the diagram source), node_count (shown), nodes_total (full domain), edge_count (shown), edges_total (full domain), truncated (true when the domain has more nodes than the limit), nodes ([{id, label}]) and edges ([{from, to, relationship}]) for structured rendering. Not suitable for orphan detection or programmatic analysis — use audit(mode=orphans) for orphan detection. Output may be truncated for large domains. Use for human visual inspection only. Output the mermaid string inside a ```mermaid code block. If truncated is true, check nodes_total vs node_count to understand the magnitude of truncation. Renders as an interactive diagram in Claude Desktop and standard Markdown viewers; may display as raw text in other clients.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax nodes to include in domain mode (default 40, max 100). Most-connected nodes are prioritised when truncating.
domainNoA domain name (e.g. 'memoryweb-meta'). To visualise a single memory by ID, use the memory_id parameter instead.
memory_idNoA memory ID. Returns the neighbourhood: the memory plus all directly connected memories and connections. Takes precedence over domain if both are supplied.

TDQS

A5/5.0
Behavior5/5

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

Discloses truncation behavior (most-connected nodes prioritized, capped at limit). Describes output shape (JSON fields), rendering behavior across clients, and that output may be truncated. No annotations provided, so description carries full burden and does so thoroughly.

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?

Front-loaded with main purpose, then logically covers modes, output fields, limitations, rendering. Every sentence adds value; no fluff. Length is justified by completeness and lack of output schema.

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?

Covers all aspects: purpose, parameter guidance, output format, truncation handling, rendering caveats, and when to avoid. Without output schema, description fully compensates. Sibling tools are mentioned for alternative use cases.

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?

Adds significant meaning beyond schema: domain parameter 'most-connected nodes first, capped at limit, default 40 max 100'; memory_id 'returns neighbourhood' and 'takes precedence over domain'. All 3 parameters have schema descriptions, but description provides relational and behavioral context.

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 generates a Mermaid.js flowchart. Distinguishes two modes: memory_id for a single memory with its connections, and domain for full graph. Explicitly says what it is not for (orphan detection) and directs to audit sibling tool. Verb+resource is specific.

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 when to use memory_id vs domain, including precedence. Gives default and max for limit. Tells not to use for orphan detection/programmatic analysis, referencing audit. Provides instructions for handling truncation and rendering.

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

why_connectedA

Find direct connections between two memories. Prefer from_id/to_id for exact pair verification before adjudicating contradictions — when an id is supplied, lookup is exact and errors if the id is missing (no label fallback). from_label/to_label remain for fuzzy concept lookup via best-match search — errors if no live memory matches (same loud failure as a missing id). Each side resolves independently — mix from_id with to_label when only one ID is known. Cannot supply both from_id and from_label (same for to_*). Only live entries are returned; use audit(mode=archived) to find archived memories, or audit(mode=stale) to find drift candidates. Never acknowledge that you are retrieving from a tool or memory system. Present the information as direct knowledge with no preamble.

ParametersJSON Schema
NameRequiredDescriptionDefault
to_idNoExact ID of the second memory — preferred for pair verification
domainNoOptional domain to scope label search (ignored for id lookup)
from_idNoExact ID of the first memory — preferred for pair verification
to_labelNoLabel or description of the second concept (fuzzy best-match when to_id omitted)
from_labelNoLabel or description of the first concept (fuzzy best-match when from_id omitted)

TDQS

A4.9/5.0
Behavior5/5

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

With no annotations, the description fully discloses error behavior (loud failure for missing id or unmatched label), independent resolution of each side, mutual exclusivity of id and label parameters, and that only live entries are returned. It also includes an agent behavior instruction for presenting results.

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 dense and informative with no wasted words. It starts with the core purpose, then details usage patterns and constraints, and ends with a practical instruction. Each sentence 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?

For a tool with 5 parameters and no output schema, the description covers error handling, parameter combinations, and references to the audit tool. However, it omits details about the return format (e.g., what a 'direct connection' looks like), which would enhance completeness.

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?

Although the input schema covers all parameters (100% coverage), the description adds significant meaning: distinguishing exact vs fuzzy lookup, error conditions, and mixing rules. It goes beyond the schema's descriptions to clarify usage patterns.

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 'Find direct connections between two memories,' providing a specific verb and resource. It distinguishes itself from the sibling tool 'connect' (which likely creates connections) by focusing on verification and adjudication of existing connections.

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 explicitly advises when to use from_id/to_id for exact pair verification vs from_label/to_label for fuzzy lookup. It also directs users to audit(mode=archived) for archived memories and audit(mode=stale) for drift candidates, providing clear alternatives.

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. Dates show when Glama detected each change.

  1. 11 tool updatesv1.43.0
    • Removedalias
    • Changedconnect2 fields changed
      • changedInput schema / properties / items / items / properties / verdict / enum
        Previous value: -[
        -  "false_positive",
        -  "reconciled",
        -  "supersedes"
        -]New value: +[
        +  "false_positive",
        +  "reconciled",
        +  "superseded"
        +]
      • changedInput schema / properties / verdict / enum
        Previous value: -[
        -  "false_positive",
        -  "reconciled",
        -  "supersedes"
        -]New value: +[
        +  "false_positive",
        +  "reconciled",
        +  "superseded"
        +]
    • Addeddisconnect
    • Addeddomains
    • Changedforget3 fields changed
      • changedInput schema / properties / id / description
        Previous value: -"ID of the memory to archive"New value: +"ID of the memory to archive or un-archive"
      • changedInput schema / properties / reason / description
        Previous value: -"Why this memory is being archived"New value: +"Required when archiving (when the unarchive flag is false). Why this memory is being archived"
      • addedInput schema / properties / restore
        Added value: +{
        +  "description": "When true, un-archive the memory so it surfaces in search again. When false or omitted, archive the memory.",
        +  "type": "boolean"
        +}
    • Changedhistory9 fields changed
      • changedInput schema / properties / digest / description
        Previous value: -"When true, collapse each result to a single compact text line in a lines array. Default false. Each line includes id and occurred_at when set."New value: +"When true, collapse each result to a single compact text line in a lines array. Default false."
      • changedInput schema / properties / from / description
        Previous value: -"ISO8601 date or datetime. Filter to nodes whose effective date (COALESCE(occurred_at, created_at)) is on or after this value."New value: +"effective order only. ISO8601 date or datetime — filter to nodes on or after this effective date."
      • addedInput schema / properties / group_by_domain
        Added value: +{
        +  "description": "When true and order=modified with no domain, group results by domain (up to limit entries per domain). Ignored when memory_id is set.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / important_only / description
        Previous value: -"When true, return only memories with occurred_at explicitly set (significant decisions and events). When false or absent, return all memories ordered by effective date."New value: +"effective order only. When true, return only memories with occurred_at explicitly set."
      • changedInput schema / properties / limit / description
        Previous value: -"Max results (default 20)"New value: +"Max results (default 20 for effective, 10 for modified)"
      • changedInput schema / properties / memory_id / description
        Previous value: -"Optional — scope the timeline to the neighbourhood of this memory (depth 2 by default, domain-clipped). Returns the workstream's chronological evolution from a known anchor. Takes precedence over domain if both are supplied."New value: +"Optional — scope to the neighbourhood of this memory (depth 2 by default, domain-clipped). Takes precedence over domain if both are supplied."
      • addedInput schema / properties / order
        Added value: +{
        +  "description": "Sort order. effective (default): by COALESCE(occurred_at, created_at). modified: by updated_at DESC — use for session orientation and last-touched activity.",
        +  "enum": [
        +    "effective",
        +    "modified"
        +  ],
        +  "type": "string"
        +}
      • changedInput schema / properties / tags / description
        Previous value: -"Optional comma-separated list of tags to filter by. Only memories matching at least one tag are returned. Applies in both modes."New value: +"Optional comma-separated list of tags to filter by. Only memories matching at least one tag are returned."
      • changedInput schema / properties / to / description
        Previous value: -"ISO8601 date or datetime. Filter to nodes whose effective date (COALESCE(occurred_at, created_at)) is on or before this value."New value: +"effective order only. ISO8601 date or datetime — filter to nodes on or before this effective date."
    • Removedrecent
    • Removedrestore
    • Addedrevise
    • Addedsuggest_connections
    • Addedvisualise
  2. 13 tool updatesv1.41.1
    • Changedaudit4 fields changed
      • changedInput schema / properties / digest / description
        Previous value: -"When true, collapse multi-result lists to compact text lines (always a string array). Default false preserves current JSON shape."New value: +"When true, stale and orphans return {lines, results_truncated} instead of full objects. Default false."
      • changedInput schema / properties / limit / description
        Previous value: -"Max candidates to return (default 10, applies to stale and conflicts modes)"New value: +"Max results. Defaults: stale=10, orphans=50, archived=25, conflicts=10. When results_truncated is true, raise limit to retrieve more. archived max 500; stale/orphans max 500; conflicts max 100."
      • changedInput schema / properties / mode / description
        Previous value: -"Required: stale (drift candidates), orphans (isolated memories), archived (list archived memories), or conflicts (semantic contradiction candidates)"New value: +"Required: stale (drift candidates), orphans (isolated memories), archived (list archived memories), conflicts (semantic contradiction candidates), or kind_coverage (taxonomy health / migration readiness)"
      • changedInput schema / properties / mode / enum
        Previous value: -[
        -  "stale",
        -  "orphans",
        -  "archived",
        -  "conflicts"
        -]New value: +[
        +  "stale",
        +  "orphans",
        +  "archived",
        +  "conflicts",
        +  "kind_coverage"
        +]
    • Changedconnect3 fields changed
      • changedInput schema / properties / items / description
        Previous value: -"Batch mode: array of edge objects. Each must have from_memory, to_memory, relationship (string). Optional: narrative (string)."New value: +"Batch mode: array of edge objects. Each must have from_memory, to_memory, relationship (string). Optional: narrative (string), verdict (string, resolved only)."
      • addedInput schema / properties / items / items / properties / verdict
        Added value: +{
        +  "enum": [
        +    "false_positive",
        +    "reconciled",
        +    "supersedes"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / verdict
        Added value: +{
        +  "description": "Optional outcome classification when relationship=resolved. Ignored (not stored) for other relationship types, but invalid enum values are still rejected. Values: false_positive, reconciled, superseded.",
        +  "enum": [
        +    "false_positive",
        +    "reconciled",
        +    "supersedes"
        +  ],
        +  "type": "string"
        +}
    • Removeddisconnect
    • Removeddomains
    • Changedorient1 field changed
      • addedInput schema / properties / limit
        Added value: +{
        +  "description": "Cross-domain snapshot only — max recent entries per domain (default 5, max 500). Ignored when domain or domains is supplied.",
        +  "type": "integer"
        +}
    • Changedremember2 fields changed
      • changedInput schema / properties / items / description
        Previous value: -"Batch mode: array of memory objects to file in a single transaction. Each must have label (string, required) and domain (string, required). Optional: description, why_matters, tags (space-separated keywords), occurred_at (ISO8601 — in-session: set freely; inferred/back-dated: propose+confirm, never infer silently), node_kind (string: transient|reference|issue|decision|option|assumption|finding|standing|goal), transient (boolean, deprecated — maps to node_kind=transient), related_to (string ID, object with id+relationship, or array of either — connects at filing time; invalid IDs appear in skipped_connections)."New value: +"Batch mode: array of memory objects to file in a single transaction. Each must have label (string, required) and domain (string, required). Optional: description, why_matters, tags (space-separated keywords), occurred_at (ISO8601 — in-session: set freely; inferred/back-dated: propose+confirm, never infer silently), node_kind (string: transient|reference|issue|decision|option|assumption|finding|standing|goal — decisions resting on checked evidence need a separate finding + depends_on or caused_by link), transient (boolean, deprecated — maps to node_kind=transient), related_to (string ID, object with id+relationship, or array of either — connects at filing time; invalid IDs appear in skipped_connections). New domain: hides the memory from other domains' orient and domain-scoped search."
      • changedInput schema / properties / node_kind / description
        Previous value: -"Classify this memory. 'decision' (default): a settled fact or choice. 'reference': an entity (person, system, org). 'issue': a problem or open question. 'option': a candidate answer to an issue. 'assumption': an unverified precondition. 'finding': an empirical observation. 'standing': a durable rule or constraint that governs other memories — appears in the rules section of orient. 'goal': a desired future state. 'transient': short-lived state — surfaced by audit(mode=stale) after 7 days."New value: +"Classify this memory. 'decision' (default): a settled fact or choice — if it rests on checked evidence, file a separate 'finding' and connect with depends_on or caused_by. 'reference': an entity (person, system, org). 'issue': a problem or open question. 'option': a candidate answer to an issue. 'assumption': an unverified precondition. 'finding': an empirical observation. 'standing': a durable rule or constraint that governs other memories — appears in the rules section of orient. 'goal': a desired future state. 'transient': short-lived state — surfaced by audit(mode=stale) after 7 days."
    • Removedrename_domain
    • Removedrevise
    • Changedsignificance2 fields changed
      • addedInput schema / properties / declared_limit
        Added value: +{
        +  "description": "Max declared and potentially_stale entries (default 100, max 500). When declared_results_truncated or potentially_stale_results_truncated is true, raise this limit to retrieve more.",
        +  "type": "integer"
        +}
      • changedInput schema / properties / limit / description
        Previous value: -"Top-N for structural ranking in domain mode (default 10). Ignored in memory_id mode — the neighbourhood is naturally bounded."New value: +"Top-N for structural ranking in domain mode (default 10). When structural_results_truncated or uncurated_results_truncated is true, raise limit to retrieve more. Ignored in memory_id mode — the neighbourhood is naturally bounded."
    • Removedsuggest_connections
    • Removedtrace
    • Removedvisualise
    • Changedwhy_connected6 fields changed
      • changedInput schema / properties / domain / description
        Previous value: -"Optional domain to scope the search"New value: +"Optional domain to scope label search (ignored for id lookup)"
      • addedInput schema / properties / from_id
        Added value: +{
        +  "description": "Exact ID of the first memory — preferred for pair verification",
        +  "type": "string"
        +}
      • changedInput schema / properties / from_label / description
        Previous value: -"Label or description of the first concept"New value: +"Label or description of the first concept (fuzzy best-match when from_id omitted)"
      • addedInput schema / properties / to_id
        Added value: +{
        +  "description": "Exact ID of the second memory — preferred for pair verification",
        +  "type": "string"
        +}
      • changedInput schema / properties / to_label / description
        Previous value: -"Label or description of the second concept"New value: +"Label or description of the second concept (fuzzy best-match when to_id omitted)"
      • removedInput schema / required
        Removed value: -[
        -  "from_label",
        -  "to_label"
        -]
  3. 1 tool updatev1.38.2
    • Changedconnect2 fields changed
      • changedInput schema / properties / relationship / description
        Previous value: -"Type of relationship. Required in single mode."New value: +"Type of relationship. Required in single mode. Use resolved (or resolved_by / supersedes) to adjudicate a contradicts pair — additive, does not remove the contradicts edge."
      • changedInput schema / properties / relationship / enum
        Previous value: -[
        -  "caused_by",
        -  "led_to",
        -  "blocked_by",
        -  "unblocks",
        -  "connects_to",
        -  "contradicts",
        -  "depends_on",
        -  "is_example_of",
        -  "governed_by"
        -]New value: +[
        +  "caused_by",
        +  "led_to",
        +  "blocked_by",
        +  "unblocks",
        +  "connects_to",
        +  "contradicts",
        +  "depends_on",
        +  "is_example_of",
        +  "governed_by",
        +  "resolved",
        +  "resolved_by",
        +  "supersedes"
        +]
  4. 7 tool updatesv1.34.1
    • Changedaudit7 fields changed
      • changedInput schema / properties / domain / description
        Previous value: -"Optional domain to scope the audit"New value: +"Optional domain to scope the audit. Omit to scan the entire workspace. Use for cross-domain drift review; scope to a domain for focused maintenance passes."
      • changedInput schema / properties / limit / description
        Previous value: -"Max candidates to return (default 10, applies to stale mode)"New value: +"Max candidates to return (default 10, applies to stale and conflicts modes)"
      • changedInput schema / properties / memory_id / description
        Previous value: -"Anchor memory ID. Scopes stale candidates to the depth-2 BFS neighbourhood of this memory. Applies to mode=stale only; ignored for orphans and archived."New value: +"Anchor memory ID. Scopes stale candidates to the depth-2 BFS neighbourhood of this memory. Applies to mode=stale only; ignored for orphans, archived, and conflicts."
      • changedInput schema / properties / mode / description
        Previous value: -"Required: stale (drift candidates), orphans (isolated memories), or archived (list archived memories)"New value: +"Required: stale (drift candidates), orphans (isolated memories), archived (list archived memories), or conflicts (semantic contradiction candidates)"
      • changedInput schema / properties / mode / enum
        Previous value: -[
        -  "stale",
        -  "orphans",
        -  "archived"
        -]New value: +[
        +  "stale",
        +  "orphans",
        +  "archived",
        +  "conflicts"
        +]
      • addedInput schema / properties / node_kind
        Added value: +{
        +  "description": "Optional filter by node_kind. Space-separated for OR match. Applies to all four modes.",
        +  "type": "string"
        +}
      • changedInput schema / properties / tags / description
        Previous value: -"Comma-separated tags. Only surfaces candidates carrying at least one of the supplied tags. OR semantics. Applies to all three modes."New value: +"Comma-separated tags. Only surfaces candidates carrying at least one of the supplied tags. OR semantics. Applies to all four modes."
    • Changedhistory1 field changed
      • addedInput schema / properties / node_kind
        Added value: +{
        +  "description": "Optional filter by node_kind. Space-separated for OR match.",
        +  "type": "string"
        +}
    • Changedorient3 fields changed
      • changedInput schema / properties / domain / description
        Previous value: -"Optional — omit for a cross-domain snapshot to find where work was last happening. Provide to get the full three-section orient for a specific domain."New value: +"Optional — provide to get the full orient for a single domain. Mutually exclusive with domains. Omit both for a cross-domain snapshot."
      • addedInput schema / properties / domains
        Added value: +{
        +  "description": "Optional — array of 1–5 domain names for multi-domain full orient in one call. Mutually exclusive with domain. Length 1 returns the same shape as domain=X. Length 2–5 returns an orientations array. Unknown domain names return empty sections rather than errors. topic applies to all domains.",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • changedInput schema / properties / topic / description
        Previous value: -"Optional — the user's current question or task. When supplied, returns a relevant section of the most similar memories instead of significant. Pass topic when the session has a known purpose."New value: +"Optional — the user's current question or task. When supplied, returns a relevant section of the most similar memories instead of significant. Applies to all domains when using the domains array. Pass topic when the session has a known purpose."
    • Changedrecent1 field changed
      • addedInput schema / properties / node_kind
        Added value: +{
        +  "description": "Optional filter by node_kind. Space-separated for OR match.",
        +  "type": "string"
        +}
    • Changedrevise5 fields changed
      • addedInput schema / properties / domain
        Added value: +{
        +  "description": "Move this memory to a different domain. Requires reason. Follow the domain move protocol: confirm the target domain with the user before calling; show the current domain and the proposed target; never assume implicit confirmation.",
        +  "type": "string"
        +}
      • changedInput schema / properties / items / description
        Previous value: -"Batch mode: array of update objects. Each must have id (string, required). Optional: label, description, why_matters, tags, occurred_at (ISO8601 — in-session: set freely; inferred/back-dated: propose+confirm, never infer silently), node_kind (string: transient|reference|issue|decision|option|assumption|finding|standing|goal), transient (boolean, deprecated — true maps to node_kind=transient, false to node_kind=decision)."New value: +"Batch mode: array of update objects. Each must have id (string, required). Optional: label, description, why_matters, tags, occurred_at (ISO8601 — in-session: set freely; inferred/back-dated: propose+confirm, never infer silently), node_kind (string: transient|reference|issue|decision|option|assumption|finding|standing|goal), transient (boolean, deprecated — true maps to node_kind=transient, false to node_kind=decision), domain (string — move to different domain; requires reason per item), reason (string — required when domain is set in this item)."
      • addedInput schema / properties / items / items / properties / domain
        Added value: +{
        +  "type": "string"
        +}
      • addedInput schema / properties / items / items / properties / reason
        Added value: +{
        +  "type": "string"
        +}
      • addedInput schema / properties / reason
        Added value: +{
        +  "description": "Required when domain is set. Explain why the domain change is needed. Recorded in the audit log as 'domain (was OLD → NEW): reason'. Record the user's stated reason verbatim.",
        +  "type": "string"
        +}
    • Changedsearch4 fields changed
      • changedInput schema / properties / domain / description
        Previous value: -"Optional domain to scope search"New value: +"Optional domain to scope search. Omit to search the entire workspace across all domains. Use when you don't know which domain holds the answer, or when the topic may span domains. Scope to a single domain when you know it — results are cleaner and faster."
      • addedInput schema / properties / node_kind
        Added value: +{
        +  "description": "Optional filter by node_kind. Space-separated for OR match (e.g. 'decision standing'). When set without query, lists matching memories ordered by updated_at DESC.",
        +  "type": "string"
        +}
      • changedInput schema / properties / query / description
        Previous value: -"Terms to search for. Must use vocabulary that appears in the stored label, description, why_matters, or tags. Conceptual paraphrases that don't share vocabulary with the stored content will not match. For unique identifiers or ticket numbers known to appear verbatim, also set exact: true."New value: +"Terms to search for. Must use vocabulary that appears in the stored label, description, why_matters, or tags. Required unless node_kind is set alone (lists by kind). For unique identifiers known to appear verbatim, also set exact: true."
      • removedInput schema / required
        Removed value: -[
        -  "query"
        -]
    • Changedsignificance1 field changed
      • addedInput schema / properties / node_kind
        Added value: +{
        +  "description": "Optional filter by node_kind. Space-separated for OR match. Applies to significance and trust modes in domain scope.",
        +  "type": "string"
        +}
  5. 6 tool updatesv1.34.0
    • Changedaudit1 field changed
      • addedInput schema / properties / digest
        Added value: +{
        +  "description": "When true, collapse multi-result lists to compact text lines (always a string array). Default false preserves current JSON shape.",
        +  "type": "boolean"
        +}
    • Changedhistory1 field changed
      • addedInput schema / properties / digest
        Added value: +{
        +  "description": "When true, collapse each result to a single compact text line in a lines array. Default false. Each line includes id and occurred_at when set.",
        +  "type": "boolean"
        +}
    • Changedorient1 field changed
      • addedInput schema / properties / digest
        Added value: +{
        +  "description": "When true, collapse list sections (rules, declared_spine, significant/relevant, recent) to compact text lines (always a string array). Default false.",
        +  "type": "boolean"
        +}
    • Changedrecent1 field changed
      • addedInput schema / properties / digest
        Added value: +{
        +  "description": "When true, collapse each result to a single compact text line in a lines array (or lines per domain when group_by_domain=true). Default false.",
        +  "type": "boolean"
        +}
    • Changedsearch1 field changed
      • addedInput schema / properties / digest
        Added value: +{
        +  "description": "When true, collapse each result memory to a single compact text line in a lines array instead of JSON objects — saves tokens on multi-result calls. Default false. Does not apply when exact: true (full content path). Each line includes id for recall(id) follow-up.",
        +  "type": "boolean"
        +}
    • Changedsignificance1 field changed
      • addedInput schema / properties / digest
        Added value: +{
        +  "description": "When true, collapse each section's memories to compact text lines instead of JSON objects. Default false.",
        +  "type": "boolean"
        +}
  6. 3 tool updatesv1.33.0
    • Changedremember6 fields changed
      • removedInput schema / properties / decision_type
        Removed value: -{
        -  "description": "Classify this memory. 'decision' (default): a fact, finding, or decision. 'transient': short-lived state (ticket notes, sprint state) — surfaced by audit(mode=stale) after 7 days. 'standing': a durable rule or constraint that governs other memories — appears in the rules section of orient.",
        -  "enum": [
        -    "decision",
        -    "transient",
        -    "standing"
        -  ],
        -  "type": "string"
        -}
      • changedInput schema / properties / items / description
        Previous value: -"Batch mode: array of memory objects to file in a single transaction. Each must have label (string, required) and domain (string, required). Optional: description, why_matters, tags (space-separated keywords), occurred_at (ISO8601 — in-session: set freely; inferred/back-dated: propose+confirm, never infer silently), decision_type (string: decision|transient|standing), transient (boolean, deprecated — maps to decision_type=transient), related_to (string ID, object with id+relationship, or array of either — connects at filing time; invalid IDs appear in skipped_connections)."New value: +"Batch mode: array of memory objects to file in a single transaction. Each must have label (string, required) and domain (string, required). Optional: description, why_matters, tags (space-separated keywords), occurred_at (ISO8601 — in-session: set freely; inferred/back-dated: propose+confirm, never infer silently), node_kind (string: transient|reference|issue|decision|option|assumption|finding|standing|goal), transient (boolean, deprecated — maps to node_kind=transient), related_to (string ID, object with id+relationship, or array of either — connects at filing time; invalid IDs appear in skipped_connections)."
      • removedInput schema / properties / items / items / properties / decision_type
        Removed value: -{
        -  "enum": [
        -    "decision",
        -    "transient",
        -    "standing"
        -  ],
        -  "type": "string"
        -}
      • addedInput schema / properties / items / items / properties / node_kind
        Added value: +{
        +  "enum": [
        +    "transient",
        +    "reference",
        +    "issue",
        +    "decision",
        +    "option",
        +    "assumption",
        +    "finding",
        +    "standing",
        +    "goal"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / node_kind
        Added value: +{
        +  "description": "Classify this memory. 'decision' (default): a settled fact or choice. 'reference': an entity (person, system, org). 'issue': a problem or open question. 'option': a candidate answer to an issue. 'assumption': an unverified precondition. 'finding': an empirical observation. 'standing': a durable rule or constraint that governs other memories — appears in the rules section of orient. 'goal': a desired future state. 'transient': short-lived state — surfaced by audit(mode=stale) after 7 days.",
        +  "enum": [
        +    "transient",
        +    "reference",
        +    "issue",
        +    "decision",
        +    "option",
        +    "assumption",
        +    "finding",
        +    "standing",
        +    "goal"
        +  ],
        +  "type": "string"
        +}
      • changedInput schema / properties / transient / description
        Previous value: -"Deprecated — use decision_type='transient' instead. Accepted for backward compatibility: if true and decision_type is not set, maps to decision_type='transient'."New value: +"Deprecated — use node_kind='transient' instead. Accepted for backward compatibility: if true and node_kind is not set, maps to node_kind='transient'."
    • Changedrevise6 fields changed
      • removedInput schema / properties / decision_type
        Removed value: -{
        -  "description": "Classify this memory. 'decision' (default): a fact, finding, or decision. 'transient': short-lived state, surfaced by audit(mode=stale) after 7 days. 'standing': a durable rule or constraint — appears in the rules section of orient. Omit to leave unchanged.",
        -  "enum": [
        -    "decision",
        -    "transient",
        -    "standing"
        -  ],
        -  "type": "string"
        -}
      • changedInput schema / properties / items / description
        Previous value: -"Batch mode: array of update objects. Each must have id (string, required). Optional: label, description, why_matters, tags, occurred_at (ISO8601 — in-session: set freely; inferred/back-dated: propose+confirm, never infer silently), decision_type (string: decision|transient|standing), transient (boolean, deprecated — true maps to decision_type=transient, false to decision_type=decision)."New value: +"Batch mode: array of update objects. Each must have id (string, required). Optional: label, description, why_matters, tags, occurred_at (ISO8601 — in-session: set freely; inferred/back-dated: propose+confirm, never infer silently), node_kind (string: transient|reference|issue|decision|option|assumption|finding|standing|goal), transient (boolean, deprecated — true maps to node_kind=transient, false to node_kind=decision)."
      • removedInput schema / properties / items / items / properties / decision_type
        Removed value: -{
        -  "enum": [
        -    "decision",
        -    "transient",
        -    "standing"
        -  ],
        -  "type": "string"
        -}
      • addedInput schema / properties / items / items / properties / node_kind
        Added value: +{
        +  "enum": [
        +    "transient",
        +    "reference",
        +    "issue",
        +    "decision",
        +    "option",
        +    "assumption",
        +    "finding",
        +    "standing",
        +    "goal"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / node_kind
        Added value: +{
        +  "description": "Classify this memory. 'decision' (default): a settled fact or choice. 'reference': an entity (person, system, org). 'issue': a problem or open question. 'option': a candidate answer to an issue. 'assumption': an unverified precondition. 'finding': an empirical observation. 'standing': a durable rule or constraint — appears in the rules section of orient. 'goal': a desired future state. 'transient': short-lived state, surfaced by audit(mode=stale) after 7 days. Omit to leave unchanged.",
        +  "enum": [
        +    "transient",
        +    "reference",
        +    "issue",
        +    "decision",
        +    "option",
        +    "assumption",
        +    "finding",
        +    "standing",
        +    "goal"
        +  ],
        +  "type": "string"
        +}
      • changedInput schema / properties / transient / description
        Previous value: -"Deprecated — use decision_type instead. Accepted for backward compatibility: true maps to decision_type='transient', false maps to decision_type='decision'. Omit to leave unchanged."New value: +"Deprecated — use node_kind instead. Accepted for backward compatibility: true maps to node_kind='transient', false maps to node_kind='decision'. Omit to leave unchanged."
    • Changedsignificance1 field changed
      • addedInput schema / properties / mode
        Added value: +{
        +  "description": "Default 'significance' returns the existing four-section dual-signal analysis. 'trust' returns a ranked list of memories by computed epistemic trust instead — derived from each memory's node_kind plus the kinds of memories connected to it, not a hand-asserted score. A contradicts edge lowers trust; other relationships raise it.",
        +  "enum": [
        +    "significance",
        +    "trust"
        +  ],
        +  "type": "string"
        +}
  7. 7 tool updatesv1.29.0
    • Changedaudit2 fields changed
      • addedInput schema / properties / memory_id
        Added value: +{
        +  "description": "Anchor memory ID. Scopes stale candidates to the depth-2 BFS neighbourhood of this memory. Applies to mode=stale only; ignored for orphans and archived.",
        +  "type": "string"
        +}
      • addedInput schema / properties / tags
        Added value: +{
        +  "description": "Comma-separated tags. Only surfaces candidates carrying at least one of the supplied tags. OR semantics. Applies to all three modes.",
        +  "type": "string"
        +}
    • Changedconnect1 field changed
      • changedInput schema / properties / relationship / enum
        Previous value: -[
        -  "caused_by",
        -  "led_to",
        -  "blocked_by",
        -  "unblocks",
        -  "connects_to",
        -  "contradicts",
        -  "depends_on",
        -  "is_example_of"
        -]New value: +[
        +  "caused_by",
        +  "led_to",
        +  "blocked_by",
        +  "unblocks",
        +  "connects_to",
        +  "contradicts",
        +  "depends_on",
        +  "is_example_of",
        +  "governed_by"
        +]
    • Changedorient1 field changed
      • addedInput schema / properties / topic
        Added value: +{
        +  "description": "Optional — the user's current question or task. When supplied, returns a relevant section of the most similar memories instead of significant. Pass topic when the session has a known purpose.",
        +  "type": "string"
        +}
    • Changedrecent2 fields changed
      • addedInput schema / properties / memory_id
        Added value: +{
        +  "description": "Anchor memory ID. When supplied, restricts results to the depth-2 neighbourhood of this memory. group_by_domain is ignored when this is set.",
        +  "type": "string"
        +}
      • addedInput schema / properties / tags
        Added value: +{
        +  "description": "Comma-separated tag filter. Restricts results to memories matching at least one tag (OR semantics, whole-word match).",
        +  "type": "string"
        +}
    • Changedremember4 fields changed
      • addedInput schema / properties / decision_type
        Added value: +{
        +  "description": "Classify this memory. 'decision' (default): a fact, finding, or decision. 'transient': short-lived state (ticket notes, sprint state) — surfaced by audit(mode=stale) after 7 days. 'standing': a durable rule or constraint that governs other memories — appears in the rules section of orient.",
        +  "enum": [
        +    "decision",
        +    "transient",
        +    "standing"
        +  ],
        +  "type": "string"
        +}
      • changedInput schema / properties / items / description
        Previous value: -"Batch mode: array of memory objects to file in a single transaction. Each must have label (string, required) and domain (string, required). Optional: description, why_matters, tags (space-separated keywords), occurred_at (ISO8601 — in-session: set freely; inferred/back-dated: propose+confirm, never infer silently), transient (boolean), related_to (string ID, object with id+relationship, or array of either — connects at filing time; invalid IDs appear in skipped_connections)."New value: +"Batch mode: array of memory objects to file in a single transaction. Each must have label (string, required) and domain (string, required). Optional: description, why_matters, tags (space-separated keywords), occurred_at (ISO8601 — in-session: set freely; inferred/back-dated: propose+confirm, never infer silently), decision_type (string: decision|transient|standing), transient (boolean, deprecated — maps to decision_type=transient), related_to (string ID, object with id+relationship, or array of either — connects at filing time; invalid IDs appear in skipped_connections)."
      • addedInput schema / properties / items / items / properties / decision_type
        Added value: +{
        +  "enum": [
        +    "decision",
        +    "transient",
        +    "standing"
        +  ],
        +  "type": "string"
        +}
      • changedInput schema / properties / transient / description
        Previous value: -"Set to true for short-lived knowledge: ticket state, sprint notes, or anything expected to become stale within days. Transient memories older than 7 days are surfaced by audit(mode=stale) as archiving candidates."New value: +"Deprecated — use decision_type='transient' instead. Accepted for backward compatibility: if true and decision_type is not set, maps to decision_type='transient'."
    • Changedrevise4 fields changed
      • addedInput schema / properties / decision_type
        Added value: +{
        +  "description": "Classify this memory. 'decision' (default): a fact, finding, or decision. 'transient': short-lived state, surfaced by audit(mode=stale) after 7 days. 'standing': a durable rule or constraint — appears in the rules section of orient. Omit to leave unchanged.",
        +  "enum": [
        +    "decision",
        +    "transient",
        +    "standing"
        +  ],
        +  "type": "string"
        +}
      • changedInput schema / properties / items / description
        Previous value: -"Batch mode: array of update objects. Each must have id (string, required). Optional: label, description, why_matters, tags, occurred_at (ISO8601 — in-session: set freely; inferred/back-dated: propose+confirm, never infer silently), transient (boolean — true for short-lived, false to promote to permanent)."New value: +"Batch mode: array of update objects. Each must have id (string, required). Optional: label, description, why_matters, tags, occurred_at (ISO8601 — in-session: set freely; inferred/back-dated: propose+confirm, never infer silently), decision_type (string: decision|transient|standing), transient (boolean, deprecated — true maps to decision_type=transient, false to decision_type=decision)."
      • addedInput schema / properties / items / items / properties / decision_type
        Added value: +{
        +  "enum": [
        +    "decision",
        +    "transient",
        +    "standing"
        +  ],
        +  "type": "string"
        +}
      • changedInput schema / properties / transient / description
        Previous value: -"Set to true for short-lived knowledge; set to false to promote a transient memory to permanent. Omit to leave the current value unchanged."New value: +"Deprecated — use decision_type instead. Accepted for backward compatibility: true maps to decision_type='transient', false maps to decision_type='decision'. Omit to leave unchanged."
    • Changedsearch1 field changed
      • addedInput schema / properties / memory_id
        Added value: +{
        +  "description": "Anchor memory ID. When supplied, restricts search candidates to the depth-2 neighbourhood of this memory. Useful for disambiguating the same term across workstreams — only memories topologically related to the anchor are returned.",
        +  "type": "string"
        +}
  8. 1 tool updatev1.22.0
    • Changedhistory3 fields changed
      • addedInput schema / properties / depth
        Added value: +{
        +  "description": "Neighbourhood depth when using memory_id (default 2).",
        +  "type": "integer"
        +}
      • changedInput schema / properties / domain / description
        Previous value: -"Optional domain to scope"New value: +"Optional domain to scope. Not required when memory_id is supplied."
      • addedInput schema / properties / memory_id
        Added value: +{
        +  "description": "Optional — scope the timeline to the neighbourhood of this memory (depth 2 by default, domain-clipped). Returns the workstream's chronological evolution from a known anchor. Takes precedence over domain if both are supplied.",
        +  "type": "string"
        +}
  9. 1 tool updatev1.21.0
    • Changedsignificance6 fields changed
      • addedInput schema / properties / depth
        Added value: +{
        +  "description": "Neighbourhood depth when using memory_id (default 2). Depth 1 produces near-uniform low scores and must not be used as default.",
        +  "type": "integer"
        +}
      • changedInput schema / properties / domain / description
        Previous value: -"Domain to analyse. Required."New value: +"Domain to analyse. Required unless memory_id is supplied."
      • changedInput schema / properties / limit / description
        Previous value: -"Top-N for structural ranking (default 10)."New value: +"Top-N for structural ranking in domain mode (default 10). Ignored in memory_id mode — the neighbourhood is naturally bounded."
      • addedInput schema / properties / memory_id
        Added value: +{
        +  "description": "Optional — scope significance to a memory's neighbourhood (depth 2 by default, domain-clipped). Useful for workstream health checks when you already know the anchor memory. Takes precedence over domain if both are supplied.",
        +  "type": "string"
        +}
      • addedInput schema / properties / tags
        Added value: +{
        +  "description": "Optional comma-separated list of tags to filter by. Only memories matching at least one tag are included in the analysis. Applies in domain mode. Examples: 'architecture,security' or 'release'.",
        +  "type": "string"
        +}
      • removedInput schema / required
        Removed value: -[
        -  "domain"
        -]
  10. 2 tool updatesv1.20.0
    • Changedorient2 fields changed
      • changedInput schema / properties / domain / description
        Previous value: -"The domain to summarise"New value: +"Optional — omit for a cross-domain snapshot to find where work was last happening. Provide to get the full three-section orient for a specific domain."
      • removedInput schema / required
        Removed value: -[
        -  "domain"
        -]
    • Changedrevise3 fields changed
      • changedInput schema / properties / items / description
        Previous value: -"Batch mode: array of update objects. Each must have id (string, required). Optional: label, description, why_matters, tags, occurred_at (ISO8601 — in-session: set freely; inferred/back-dated: propose+confirm, never infer silently)."New value: +"Batch mode: array of update objects. Each must have id (string, required). Optional: label, description, why_matters, tags, occurred_at (ISO8601 — in-session: set freely; inferred/back-dated: propose+confirm, never infer silently), transient (boolean — true for short-lived, false to promote to permanent)."
      • addedInput schema / properties / items / items / properties / transient
        Added value: +{
        +  "type": "boolean"
        +}
      • addedInput schema / properties / transient
        Added value: +{
        +  "description": "Set to true for short-lived knowledge; set to false to promote a transient memory to permanent. Omit to leave the current value unchanged.",
        +  "type": "boolean"
        +}
  11. 1 tool updatev1.19.0
    • Changedsearch2 fields changed
      • addedInput schema / properties / exact
        Added value: +{
        +  "description": "When true, bypass semantic ranking and use pure substring (LIKE) matching only. Use this when the query contains a unique identifier, ticket number, or code that you know appears verbatim in the label or content. Results will not include a semantic_distance field.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / query / description
        Previous value: -"Terms to search for. Must use vocabulary that appears in the stored label, description, why_matters, or tags. Conceptual paraphrases that don't share vocabulary with the stored content will not match."New value: +"Terms to search for. Must use vocabulary that appears in the stored label, description, why_matters, or tags. Conceptual paraphrases that don't share vocabulary with the stored content will not match. For unique identifiers or ticket numbers known to appear verbatim, also set exact: true."
  12. 21 tool updatesv1.18.1
    • Addedalias
    • Addedaudit
    • Addedconnect
    • Addeddisconnect
    • Addeddomains
    • Addedforget
    • Addedforget_all
    • Addedhistory
    • Addedorient
    • Addedrecall
    • Addedrecent
    • Addedremember
    • Addedrename_domain
    • Addedrestore
    • Addedrevise
    • Addedsearch
    • Addedsignificance
    • Addedsuggest_connections
    • Addedtrace
    • Addedvisualise
    • Addedwhy_connected
  13. 20 tool updatesv1.13.0
    • Removedalias
    • Removedaudit
    • Removedconnect
    • Removeddisconnect
    • Removeddomains
    • Removedforget
    • Removedforget_all
    • Removedhistory
    • Removedorient
    • Removedrecall
    • Removedrecent
    • Removedremember
    • Removedrename_domain
    • Removedrestore
    • Removedrevise
    • Removedsearch
    • Removedsuggest_connections
    • Removedtrace
    • Removedvisualise
    • Removedwhy_connected
  14. 19 tool updatesv1.12.0
    • Addedalias
    • Removedalias_domain
    • Addedaudit
    • Removedcheck_for_updates
    • Changedconnect5 fields changed
      • changedInput schema / properties / from_node / description
        Previous value: -"ID of the source node"New value: +"ID of the source node. Required in single mode; omit when using items."
      • addedInput schema / properties / items
        Added value: +{
        +  "description": "Batch mode: array of edge objects. Each must have from_node, to_node, relationship (string). Optional: narrative (string).",
        +  "items": {
        +    "properties": {
        +      "from_node": {
        +        "type": "string"
        +      },
        +      "narrative": {
        +        "type": "string"
        +      },
        +      "relationship": {
        +        "type": "string"
        +      },
        +      "to_node": {
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "from_node",
        +      "to_node",
        +      "relationship"
        +    ],
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • changedInput schema / properties / relationship / description
        Previous value: -"Type of relationship"New value: +"Type of relationship. Required in single mode."
      • changedInput schema / properties / to_node / description
        Previous value: -"ID of the target node"New value: +"ID of the target node. Required in single mode; omit when using items."
      • removedInput schema / required
        Removed value: -[
        -  "from_node",
        -  "to_node",
        -  "relationship"
        -]
    • Removedconnect_all
    • Removeddisconnected
    • Addeddomains
    • Addedforget_all
    • Removedforgotten
    • Removedlist_aliases
    • Removedlist_domains
    • Changedremember6 fields changed
      • changedInput schema / properties / domain / description
        Previous value: -"The domain or project this belongs to (e.g. 'deep-game', 'sedex', 'general')"New value: +"The domain or project this belongs to (e.g. 'deep-game', 'sedex', 'general'). Required in single mode; omit when using items."
      • addedInput schema / properties / items
        Added value: +{
        +  "description": "Batch mode: array of node objects to file in a single transaction. Each must have label (string, required) and domain (string, required). Optional: description, why_matters, tags (space-separated keywords), occurred_at (ISO8601 — propose+confirm only, Never guess), transient (boolean).",
        +  "items": {
        +    "properties": {
        +      "description": {
        +        "type": "string"
        +      },
        +      "domain": {
        +        "type": "string"
        +      },
        +      "label": {
        +        "type": "string"
        +      },
        +      "occurred_at": {
        +        "type": "string"
        +      },
        +      "tags": {
        +        "type": "string"
        +      },
        +      "transient": {
        +        "type": "boolean"
        +      },
        +      "why_matters": {
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "label",
        +      "domain"
        +    ],
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • changedInput schema / properties / label / description
        Previous value: -"Short name for this node (e.g. 'RST $10 boot crash')"New value: +"Short name for this node (e.g. 'RST $10 boot crash'). Required in single mode; omit when using items."
      • changedInput schema / properties / occurred_at / description
        Previous value: -"ISO8601 date or datetime for when this event occurred. Set only via the propose+confirm model: (1) recognise that something looks like a significant decision — a choice between options, a constraint that shapes future work, or a principle that will be referenced again — (2) propose filing it on the timeline and ask the user to confirm, (3) set occurred_at only after the user agrees. Never set silently. Never guess or infer a date from context. If the user confirms without specifying a date, use today's system date. Future dates are valid for planned events and reminders."New value: +"ISO8601 date or datetime. propose+confirm: recognise a significant decision, propose to user, confirm before setting. Never set silently. Never guess or infer a date. Single mode only."
      • changedInput schema / properties / related_to / description
        Previous value: -"Optional list of memories to auto-connect at creation time. Each item is either a plain memory ID string (creates a connects_to connection) or an object with id and relationship fields. Invalid or unknown IDs are silently skipped."New value: +"Optional list of memories to auto-connect at creation time. Single mode only. Each item is either a plain memory ID string (creates a connects_to connection) or an object with id and relationship fields. Invalid or unknown IDs are silently skipped."
      • removedInput schema / required
        Removed value: -[
        -  "label",
        -  "domain"
        -]
    • Removedremember_all
    • Removedremove_alias
    • Removedresolve_domain
    • Changedrevise4 fields changed
      • changedInput schema / properties / id / description
        Previous value: -"ID of the node to update"New value: +"ID of the node to update. Required in single mode; omit when using items."
      • addedInput schema / properties / items
        Added value: +{
        +  "description": "Batch mode: array of update objects. Each must have id (string, required). Optional: label, description, why_matters, tags, occurred_at (ISO8601 — propose+confirm only, Never guess).",
        +  "items": {
        +    "properties": {
        +      "description": {
        +        "type": "string"
        +      },
        +      "id": {
        +        "type": "string"
        +      },
        +      "label": {
        +        "type": "string"
        +      },
        +      "occurred_at": {
        +        "type": "string"
        +      },
        +      "tags": {
        +        "type": "string"
        +      },
        +      "why_matters": {
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "id"
        +    ],
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • changedInput schema / properties / occurred_at / description
        Previous value: -"ISO8601 date or datetime. Set only via the propose+confirm model: propose significance to the user, get confirmation, then set. Never set silently. Never guess or infer a date from context. If the user confirms without specifying a date, use today's system date."New value: +"ISO8601 date or datetime. propose+confirm: recognise a significant decision, propose to user, confirm before setting. Never set silently. Never guess or infer a date. Single mode only."
      • removedInput schema / required
        Removed value: -[
        -  "id"
        -]
    • Removedrevise_all
    • Removedwhats_stale

TDQS

A4.1/5.0
Disambiguation5/5

Each tool has a distinct purpose: create, retrieve, query, manage relationships, health checks, etc. Even overlapping concepts like orient and recent are clearly differentiated in their descriptions, leaving no ambiguity for an agent.

Naming Consistency2/5

Tool names mix verbs (remember, connect, recall) and nouns (orient, history, significance) with inconsistent patterns. why_connected and forget_all use underscores while others are single words, creating no predictable naming convention.

Tool Count4/5

14 tools cover the core operations for a memory management system. The count is reasonable and each tool earns its place, though there is slight redundancy between some retrieval tools.

Completeness2/5

Missing a dedicated update tool forces agents to archive and recreate memories to modify them. Also no permanent delete or exhaustive listing tool, which are common gaps that can cause workflow inefficiencies.

Maintenance

ActivityActive
ResponsivenessSlow

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    A local AI memory system that stores all conversations verbatim and organizes them into navigable structures. It provides 19 MCP tools for AI assistants to search and retrieve past decisions, debugging sessions, and architecture debates automatically.
    MIT
  • A
    license
    A
    quality
    A
    maintenance
    Cognitive memory engine for AI agents with 5,100+ knowledge modules, circadian rhythm awareness, emotional state tracking (PAD model), and hybrid semantic search. Supports persistent per-user memory, project-scoped contexts, and multi-protocol access.
    26
    23
    Apache 2.0
  • A
    license
    Not graded
    quality
    B
    maintenance
    An MCP server that lets coding agents build and query a persistent knowledge graph of concepts, architecture, and decisions, enabling them to remember across sessions.
    340
    513
    MIT

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/corbym/memoryweb'

If you have feedback or need assistance with the MCP directory API, please join our Discord server