Русский
Долгосрочная память для ИИ-агентов с trip2g
Разверните trip2g в Docker, подключите MCP-клиент агента, загрузите заметки. Агент будет читать и искать их как долгосрочную память. Чтение конкретных секций экономит токены: в типичном случае примерно в 15 раз дешевле, чем загружать всю заметку целиком.
Вставьте это в ваш coding-агент (Claude Code, Cursor или аналогичный), чтобы он настроил trip2g как долгосрочную память:
Follow https://trip2g.com/en/user/agent-memory to set up trip2g as your persistent memory.
Step 1 — clone the repo (memcli ships prebuilt, no separate install needed):
git clone https://github.com/trip2g/trip2g
Step 2 — boot the local memory server:
node trip2g/cli/memcli/dist/memcli.js up --folder ./memory-vault
This starts a trip2g instance on http://localhost:24081, mints an admin key
via HAT, launches the trip2g-sync --watch sidecar (any .md file you write to
./memory-vault is pushed to the server within ~500 ms), and writes a hub.md
federation note so you can also search trip2g.com's knowledge base.
Step 3 — register the MCP server in your agent's MCP client config:
{
"mcpServers": {
"trip2g-memory": {
"command": "python3",
"args": ["/absolute/path/to/trip2g/docs/en/user/trip2g_mcp_stdio_adapter.py"],
"env": {
"TRIP2G_MCP_URL": "http://localhost:24081/_system/mcp",
"TRIP2G_TOKEN": "t2g_your-personal-access-token"
}
}
}
}
TRIP2G_TOKEN is a personal access token (format t2g_…) — create one under
User → Tokens in the trip2g UI at http://localhost:24081. The adapter uses
Python 3 stdlib only; no pip install needed.
Step 4 — verify recall is working:
Call search("trip2g memory") via the MCP tool, then call note_html() on one
of the returned paths and show a result.
Once set up, follow these rules every session:
- REMEMBER: write durable facts as Markdown files into ./memory-vault. The
watcher syncs them in ~500 ms, making them searchable immediately.
- RECALL: always use search → expand → note_html. Read only the section you
need — it is ~15× cheaper than loading the whole note.
Два типа учётных данных:
- Admin API-ключ: используется CLI синхронизации и прямыми curl-запросами через
X-API-Key. Создаётся автоматически через memcli или вручную через GraphQL-мутации (раздел ниже). - Персональный токен (
t2g_…): используется stdio MCP-адаптером. Создайте его в разделе Пользователь → Токены в интерфейсе trip2g после запуска сервера.
Это разные сущности. Путаница чаще всего возникает при настройке MCP-адаптера. При ошибках аутентификации см. ru/user/mcp.
1. Запуск за 30 секунд через memcli
memcli запускает сервер одной командой: поднимает локальное хранилище, создаёт admin-ключ через HAT (без email, без DEV=true), стартует сайдкар trip2g-sync --watch и записывает федерационную заметку hub.md в ваш волт. Это самый быстрый путь.
Скомпилированный бандл поставляется в репозитории, сборка из свежего клона не нужна:
node cli/memcli/dist/memcli.js up --folder ./memory-vault
Готово. По завершении увидите:
memory live — web: http://localhost:24081 read/write .md in ./memory-vault
Сервер на порту 24081. MCP-эндпоинт: http://localhost:24081/_system/mcp. Sync-вотчер запущен в фоне, любой .md-файл, добавленный в ./memory-vault, появится на сервере в течение ~500 мс.
При первом запуске memcli генерирует случайные секреты (JWT_SECRET, DATA_ENCRYPTION_KEY) и сохраняет их в ./memory-vault/.trip2g-memory/env. Повторные вызовы up переиспользуют те же секреты и идемпотентны.
Другие команды memcli:
node cli/memcli/dist/memcli.js status # состояние контейнера и вотчера
node cli/memcli/dist/memcli.js logs # логи сервера
node cli/memcli/dist/memcli.js down # остановить всё
node cli/memcli/dist/memcli.js key # перевыпустить API-ключ
Флаги для up:
| Флаг | По умолчанию | Назначение |
|---|---|---|
--folder <path> |
./memory-vault |
Директория волта |
--port <n> |
24081 |
Публичный порт |
--no-hub |
(нет) | Не создавать hub.md |
--hub-url <url> |
https://trip2g.com/_system/mcp |
Другой федерационный хаб |
--image <ref> |
ghcr.io/trip2g/trip2g:latest |
Docker-образ |
Пересборка из исходников нужна только при изменении исходного кода CLI:
cd cli/memcli && npm install && npm run codegen && npm run build
codegen читает схему из репозитория; запущенный сервер не нужен.
Федерационная hub-заметка
По умолчанию memcli up записывает в волт hub.md с таким frontmatter:
mcp_federation_kb_url: https://trip2g.com/_system/mcp
Это федерирует локальный инстанс с trip2g.com: всё, что подключается к вашему /_system/mcp, получает доступ к базе знаний trip2g.com через ваш инстанс (федерация, а не копия).
Передайте --no-hub, чтобы не создавать заметку. --hub-url <url> указывает другой хаб:
node cli/memcli/dist/memcli.js up --folder ./memory-vault --hub-url https://example.com/_system/mcp
Файл hub.md хранится как обычная Markdown-заметка: удалите его, и федерационная ссылка исчезнет при следующей синхронизации.
2. Ручная установка (без memcli или для существующего compose-стека)
Этот путь подходит, если нужен полный контроль над контейнером или интеграция с существующим Docker Compose.
Запустить демон
# trip2g на порту 24081, healthcheck на 24082, ассеты хранятся на диске
# Замените ghcr.io/trip2g/trip2g:latest на trip2g:local, если собирали из исходников.
mkdir -p /tmp/trip2g-local
docker run -d --name trip2g-local \
-p 24081:24081 -p 24082:24082 \
-e LISTEN_ADDR=0.0.0.0:24081 \
-e INTERNAL_LISTEN_ADDR=0.0.0.0:24082 \
-e DB_FILE=/data/local.sqlite3 \
-e STORAGE_BACKEND=local \
-e STORAGE_LOCAL_DIR=/data/storage \
-e DEV=true \
-e OWNER_EMAIL=hello@example.com \
-e PUBLIC_URL=http://localhost:24081 \
-e JWT_SECRET=dev-secret-not-for-prod \
-e USER_TOKEN_INSECURE=true \
-e GIT_API_REPO_PATH=/data/git \
-e GIT_API_BASE_PATH=/git \
-e RESEND_API_KEY=dev \
-e MAIL_FROM=dev@example.com \
-v /tmp/trip2g-local:/data \
ghcr.io/trip2g/trip2g:latest
# убеждаемся, что контейнер запустился, ждём готовности
docker ps | grep trip2g-local
until curl -sf http://localhost:24082/healthz >/dev/null; do sleep 1; done && echo "up"
Переменные окружения кратко:
LISTEN_ADDR / INTERNAL_LISTEN_ADDR # порт приложения + порт healthcheck (внутри контейнера)
DB_FILE / STORAGE_BACKEND # путь к SQLite + бэкенд ассетов (local = диск, без S3)
STORAGE_LOCAL_DIR # куда сохраняются ассеты внутри тома
DEV=true # фиксированный код входа 111111 — не использовать в продакшене
OWNER_EMAIL # email первого admin-аккаунта (нужен при DEV=true)
PUBLIC_URL # URL, по которому приложение считает себя доступным
JWT_SECRET # HMAC-секрет — в продакшене использовать случайное значение
USER_TOKEN_INSECURE # разрешает токены по HTTP (допустимо для localhost)
GIT_API_REPO_PATH / GIT_API_BASE_PATH # git-зеркало для истории заметок
RESEND_API_KEY / MAIL_FROM # транспорт email (stub-значения работают в DEV-режиме)
Важно: флаг -p 24081:24081 -p 24082:24082 публикует порты на всех интерфейсах хоста и работает на Linux, Mac и Windows (Docker Desktop). --network host работает только на Linux. Docker Desktop запускает движок в Linux-VM, поэтому host-сеть не публикует порты на Mac и Windows, и localhost:24081 не достигнет контейнера.
Для продакшен-установки с Caddy, TLS и S3-совместимым хранилищем см. ru/user/selfhosted.
Завести API-ключ
При DEV=true фиксированный код входа: 111111. Три curl-запроса для получения ключа:
GQL=http://localhost:24081/graphql
# 1. запросить код входа (попадает в лог, не отправляется на настоящий email)
curl -s -X POST "$GQL" -H 'Content-Type: application/json' \
-d '{"query":"mutation($i:RequestEmailSignInCodeInput!){requestEmailSignInCode(input:$i){__typename}}","variables":{"i":{"email":"hello@example.com"}}}' >/dev/null
# 2. войти с кодом 111111, получить токен сессии
TOKEN=$(curl -s -X POST "$GQL" -H 'Content-Type: application/json' \
-d '{"query":"mutation($i:SignInByEmailInput!){signInByEmail(input:$i){__typename ... on SignInPayload{token} ... on ErrorPayload{message}}}","variables":{"i":{"email":"hello@example.com","code":"111111"}}}' \
| grep -o '"token":"[^"]*"' | cut -d'"' -f4)
# 3. создать API-ключ
API_KEY=$(curl -s -X POST "$GQL" -H 'Content-Type: application/json' -H "Cookie: trip2g_token=$TOKEN" \
-d '{"query":"mutation($i:CreateApiKeyInput!){admin{createApiKey(input:$i){__typename ... on CreateApiKeyPayload{value} ... on ErrorPayload{message}}}}","variables":{"i":{"description":"local"}}}' \
| grep -o '"value":"[^"]*"' | cut -d'"' -f4)
echo "API-ключ: $API_KEY"
3. Подключить агента (MCP)
trip2g открывает MCP-эндпоинт по адресу /_system/mcp. Stdio-адаптер оборачивает три шага (поиск, навигация по оглавлению, чтение секции) в один инструмент, который вызывает агент.
Скрипт адаптера docs/en/user/trip2g_mcp_stdio_adapter.py находится в репозитории trip2g (также доступен на deployed docs сайте). Скачайте его и укажите абсолютный путь в конфигурации.
Зарегистрируйте его в MCP-клиенте (Claude Desktop, Cursor, Claude Code или любой агент с MCP по stdio):
{
"mcpServers": {
"trip2g-memory": {
"command": "python3",
"args": ["/абсолютный/путь/к/trip2g_mcp_stdio_adapter.py"],
"env": {
"TRIP2G_MCP_URL": "http://localhost:24081/_system/mcp",
"TRIP2G_TOKEN": "t2g_ваш-персональный-токен"
}
}
}
}
TRIP2G_TOKEN содержит персональный токен доступа (формат t2g_…), а не admin API-ключ. Создайте его в разделе Пользователь → Токены в интерфейсе trip2g. Подробнее: ru/user/mcp (раздел «Персональные токены доступа»).
Admin API-ключ используется для прямых curl-запросов через X-API-Key и для CLI синхронизации, но не для stdio-адаптера.
Примечание: инструмент expand работает корректно только с актуальным образом. В старых локальных сборках он возвращает плоский toc вместо навигируемого дерева. Используйте ghcr.io/trip2g/trip2g:latest.
pip install не нужен: адаптер использует только стандартную библиотеку Python 3.
Доступные инструменты
Полный MCP-эндпоинт (напрямую или через адаптер) предоставляет:
| Инструмент | Что делает |
|---|---|
search(query) |
Векторный или полнотекстовый поиск по всем заметкам. Возвращает краткие сниппеты: хлебную крошку заголовка и toc_path, а не всю заметку |
expand(pid, toc_path?) |
Послойная навигация по оглавлению заметки. Возвращает прямые дочерние узлы TOC для последовательного погружения |
note_html(path, toc_path?) |
Читает всю заметку или конкретную секцию по toc_path |
similar(path) |
Находит заметки, похожие на указанную |
Адаптер оборачивает search → expand → note_html в один составной инструмент и возвращает только самую релевантную секцию. Подробнее: ru/user/ai-agent-mcp-adapter.
Аутентификация через API-ключ
API-ключи принимаются напрямую на MCP-эндпоинте:
curl http://localhost:24081/_system/mcp \
-H "X-API-Key: <ваш-api-ключ>" \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","method":"tools/list","id":1}'
API-ключ даёт доступ ко всем заметкам на уровне администратора. Для пользовательского доступа используйте персональный токен (t2g_…) из раздела Пользователь → Токены.
4. Загрузить память
CLI синхронизации публикует папку с Markdown-заметками в запущенный инстанс trip2g через API. Это шаг ingestion: ваши заметки становятся базой знаний, которую агент может искать и читать.
CLI синхронизации (obsidian-sync/dist/trip2g-sync.mjs) находится в репозитории trip2g и не включён в Docker-образ. Запустите из корня репозитория:
# из корня репозитория trip2g
node obsidian-sync/dist/trip2g-sync.mjs \
--folder /путь/к/вашему/волту \
--api-key "$API_KEY" \
--api-url http://localhost:24081/graphql \
--verbose
Повторяйте команду при добавлении или обновлении заметок. Повторно загружаются только изменённые файлы.
Заметка доступна агенту без аутентификации только при наличии free: true во frontmatter. Для приватной памяти, которую читает только ваш агент, не добавляйте free: true; аутентифицируйтесь API-ключом или токеном.
Полный справочник по CLI синхронизации: ru/user/local-quickstart.
Если вы использовали memcli, сайдкар --watch уже запущен. Достаточно просто создавать .md-файлы прямо в папке волта.
4а. Непрерывная синхронизация: --watch как сайдкар
Разовый синк из раздела 4 загружает заметки один раз. Если агент пишет заметки и вы хотите, чтобы правки были доступны сразу, запустите CLI синхронизации в режиме watch как долгоживущий сайдкар рядом с демоном trip2g.
node obsidian-sync/dist/trip2g-sync.mjs --watch \
--folder /путь/к/вашему/волту \
--api-key "$API_KEY" \
--api-url http://localhost:24081/_system/graphql
При старте выполняется полная двусторонняя сверка. Затем:
- Любая заметка, записанная агентом на диск, отправляется на сервер в течение ~500 мс (файловый вотчер + дебаунс).
- Любая заметка, изменённая на сервере, сразу записывается обратно в папку волта через SSE-подписку
noteChanges.
Процесс работает на переднем плане и выходит с ненулевым кодом при фатальной ошибке. В Docker Compose добавьте его вторым сервисом, смонтировав тот же том волта, что и контейнер агента. Ctrl-C завершает работу корректно.
Чтобы ограничить, за какими путями следит демон синхронизации, передайте глобы --include и --exclude. Полный справочник: ru/user/local-quickstart (раздел «Фильтрация: --include и --exclude»).
Смотрите за работой агента в браузере
Пока --watch запущен, откройте любую страницу сайта и добавьте к URL ?#!live_follow=1:
http://localhost:24081/some-note?#!live_follow=1
Браузер войдёт в режим следования (cinema mode) и будет автоматически переходить на заметку, изменившуюся последней. Настройка сохраняется при автопереходах, браузер продолжает следовать, пока вы не отключите режим.
Подробнее о режиме следования и переключателе перезагрузки: ru/user/live-editing.
5. Вспоминать: search → expand → note_html
После загрузки заметок агент извлекает память через MCP-инструменты в три шага:
1. search(query)
→ краткие результаты: хлебная крошка заголовка + toc_path для каждого совпадения
2. expand(pid=N) # обзор структуры верхнего уровня
expand(pid=N, toc_path=[...]) # углубиться в нужную ветку
→ повторять, пока не достигнете листа (has_children: false)
3. note_html(pid=N, toc_path=[...])
→ прочитать только нужную секцию
Если search уже вернул точный toc_path для совпадения, пропустите expand и вызовите note_html напрямую с этим путём. Адаптер делает это автоматически.
Почему это экономит токены
Чтение одной секции вместо всей заметки в типичном случае примерно в 15 раз дешевле. Ответ оказывается в начале контекста, где у модели лучший recall, а не в хвосте, где он деградирует. Цифры и воспроизводимый бенчмарк: ru/user/token-economy-bench.
Выигрыш масштабируется с размером заметки. Длинные заметки (архитектурные доки, changelog, руководства) экономят больше всего. Короткие (факт, сниппет конфига) экономят незначительно: они и так дёшевы.
Подробнее о механизме: Token Economy.
Смотрите также
- ru/user/local-quickstart: полный справочник по локальному запуску, включая флаг
--watch - ru/user/selfhosted: продакшен-установка с Docker Compose, Caddy и TLS
- ru/user/ai-agent-mcp-adapter: stdio-адаптер: один инструмент, только нужная секция
- ru/user/mcp: все MCP-методы, управление доступом и именованные точки входа
- ru/user/expand: послойная навигация по оглавлению
- ru/user/token-economy-bench: измеренная экономия токенов, воспроизводимый бенчмарк
- ru/user/live-editing: режим следования (cinema mode) и переключатель перезагрузки для наблюдения за правками в реальном времени
- ru/user/agent-status: автоматическая трансляция статуса коллегам при завершении сессии