SSD Nodes Learn 8GB RAM — $66/рік
Посібники Matt ConnorВід Matt Connor · Оновлено 2026-08-01

Memmy: спільна пам’ять AI-агентів на VPS

Дізнайтеся, як зібрати Memmy на Ubuntu, запустити сервіс пам’яті на port 18960 і зберігати нотатки агентів локально в одній базі SQLite.

Що таке Memmy і що він зберігає

Memmy — це локальний центр пам’яті для AI-агентів, який працює на вашому VPS (віртуальному приватному сервері). Він зберігає одну базу даних SQLite з усіма даними, які вивчили ваші агенти. Кожен агент на цьому сервері читає з цього самого сховища та записує до нього дані. Проєкт memmy-agent від MemTensor, ліцензований за MIT, версії 1.0.4 станом на July 2026.

На сервері потрібна лише частина компонентів. Memmy надає сервіс пам’яті, який прослуховує http://127.0.0.1:18960, інтерфейс командного рядка memmy-memory (CLI), що взаємодіє з цим сервісом, і desktop workbench. Workbench доступний лише для macOS і Windows. Тому на Linux VPS ви запускаєте сервіс і CLI. Цього достатньо, щоб Claude Code, Codex і Cursor використовували спільну пам’ять.

Memmy розподіляє збережені дані між чотирма рівнями. L1 Trace — це необроблений обмін: запит, відповідь і виклики інструментів. L2 Policy — це процедура, виведена з трас, які виявилися корисними. L3 World Model — це стабільні відомості про проєкт або середовище. Skill — це процедура, доступна для виклику, сформована на основі policy. Сервіс призначає рівень під час імпорту обміну, тому створювати рівні вручну не потрібно.

Що змінює спільний центр пам’яті порівняно з пам’яттю окремих інструментів

Сьогодні кожен агент постачається із власною пам’яттю. Claude Code зберігає файли інструкцій у репозиторії. Cursor зберігає правила у своїй базі даних робочого простору. Codex зберігає журнали сеансів у ~/.codex. Кожне сховище належить одному інструменту, тому факт, якого ви навчили один інструмент у понеділок, залишається невідомим іншому у вівторок. Ви двічі платите за це: спочатку токенами, витраченими на повторне пояснення того самого проєкту, а потім помилковою роботою, коли агент діє на основі припущення, яке ви вже виправили в іншому місці.

Центр переміщує сховище за межі інструменту. Memmy також читає наявні сховища, тому вам не потрібно починати з порожньої бази даних. Його сканер підтримує шість джерел: Claude Code у ~/.claude/projects/**/*.jsonl, Codex у ~/.codex/sessions/<YYYY>/<MM>/<DD>/rollout-*.jsonl, OpenCode у ~/.local/share/opencode/opencode.db, файли Cursor у state.vscdb, бази даних SQLite OpenClaw у ~/.openclaw і Hermes у ~/.hermes. Ви можете вручну додати джерело, указавши його назву та локальний шлях.

Лічильники імпорту не збігатимуться, і це очікувано. Сканер групує повідомлення за джерелом і розмовою, а потім записує одну пам’ять L1 для кожного завершеного обміну. Обмін вважається завершеним, якщо він містить непорожній вміст користувача та завершується непорожнім повідомленням асистента, тому перерваний сеанс нічого не додає. Повідомлення дедуплікуються за контрольними точками розмов і стабільними ідентифікаторами обмінів. Кількість просканованих повідомлень, кількість імпортованих повідомлень і кількість нових пам’ятей відрізняються навіть під час одного запуску.

Це доповнює матеріал про керування контекстом у Claude Code протягом одного сеансу. Керування контекстом визначає, що поміщається в одне контекстне вікно. Центр пам’яті визначає, що зберігається після закриття цього вікна.

Що потрібно на VPS

  • Node.js 22 або новішої версії. Документація Memmy вимагає саме його, а Ubuntu 24.04 постачається з Node 18.
  • git і набір інструментів для збирання, оскільки better-sqlite3 — це нативний модуль, який може компілюватися під час встановлення.
  • Приблизно 2 GB RAM. Встановлення root завантажує великий робочий простір і набір інструментів для збирання frontend.
  • Кілька GB вільного місця на диску для node_modules і бази даних.
sudo apt update
sudo apt install -y git build-essential python3 curl ca-certificates sqlite3
curl -fsSL https://deb.nodesource.com/setup_22.x | sudo -E bash -
sudo apt install -y nodejs
node --version

Команда node --version має вивести v22 або новішу версію. Значення v18 означає, що крок NodeSource не виконався, тому під час перевірки engine проекту встановлення завершиться помилкою.

Встановлення Memmy з вихідного коду в Ubuntu 24.04

git clone https://github.com/MemTensor/memmy-agent.git
cd memmy-agent
cp .env.example .env
npm install
npm run memory:build

npm run memory:build компілює робочу область @memmy/memory у Memory/dist. Для headless-сервера більше нічого в дереві збирати не потрібно. Перевірте, чи завантажився нативний модуль:

node -e "require('better-sqlite3'); console.log('better-sqlite3 loads')"

Якщо цей рядок завершується помилкою замість виведення результату, нативний модуль несумісний із вашою версією Node. Виконайте npm rebuild better-sqlite3. Саме це робить власний сценарій запуску проєкту перед запуском будь-яких компонентів.

У README bash scripts/dev-start.sh описано як запуск однією командою. Не виконуйте її на headless VPS. Вона запускає оболонку Electron для робочого столу та сервер розробки Vite на порту 19000 поруч із сервісом пам’яті. Electron потребує дисплея, тому на сервері без графічного сеансу сценарій зависає або завершує роботу.

Запустіть службу пам’яті та перевірте, чи відповідає вона

npm run memory:serve:dev

Це документований спосіб запуску служби пам’яті з вихідного коду. Служба прив’язується до 127.0.0.1:18960, зберігає базу даних у ~/.memmy/memory-service/memory.sqlite і читає конфігурацію з ~/.memmy/config.yaml. У README наведено ті самі значення в явному вигляді:

npm run memory:serve:dev -- \
  --host 127.0.0.1 --port 18960 \
  --db ~/.memmy/memory-service/memory.sqlite \
  --config ~/.memmy/config.yaml

Відкрийте другу оболонку та перевірте, чи працює служба:

curl -sS http://127.0.0.1:18960/api/v1/health

Перевірка стану — єдина кінцева точка, яка ніколи не запитує токен. Тому саме її слід використовувати для перевірки. Якщо curl завершується з кодом 7 і повідомленням Failed to connect to 127.0.0.1 port 18960, жоден процес не прослуховує порт. Перевірте термінал, у якому запущено службу, оскільки повідомлення про збій під час запуску виводяться саме там. Найчастіша причина — помилка завантаження нативного модуля SQLite. ss -lntp | grep 18960 підтверджує наявність сокета після запуску служби.

Решта HTTP API (application programming interface) доступна за шляхом /api/v1.

  • POST /api/v1/memory/add записує спогад, а POST /api/v1/memory/search виконує запити.
  • GET /api/v1/memory/:id і DELETE /api/v1/memory/:id читають і видаляють один запис.
  • POST /api/v1/sessions/open і POST /api/v1/sessions/:sessionId/close визначають початок і завершення сеансу агента.
  • POST /api/v1/turns/start і POST /api/v1/turns/:turnId/complete записують один обмін.
  • GET /api/v1/panel/overview, /api/v1/panel/analysis і /api/v1/panel/items передають дані до панелі моніторингу.

Memmy резервує блок портів. У headless-режимі використовується лише перший порт: 18960 для пам’яті, 18970 для перевірки стану gateway, 18980 для web UI та адміністративного HTTP, 18990 для API, сумісного з OpenAI, який запускає memmy serve, а також 19000 і 19010 для dev-сервера desktop frontend. Якщо на вашому комп’ютері один із цих портів уже зайнятий, перевірте саме цей список.

Звідки насправді походить команда memmy-memory

Саме тут зазвичай виникає помилка під час першого встановлення, тому перевірте це в пакеті, а не вгадуйте. Назва команди не має нічого спільного з назвою репозиторію. Вона походить із поля bin робочого простору, у якому її визначено:

node -p "JSON.stringify(require('./Memory/package.json').bin)"

Ця команда виводить {"memmy-memory":"./dist/src/cli/index.js"}. Отже, вбудована точка входу — Memory/dist/src/cli/index.js. Вона з’являється лише після npm run memory:build, оскільки саме процес збирання створює dist і позначає файл як виконуваний. Запустіть його безпосередньо:

node Memory/dist/src/cli/index.js health

Якщо потрібне коротке ім’я в PATH, створіть посилання на цей самий файл:

sudo ln -s "$PWD/Memory/dist/src/cli/index.js" /usr/local/bin/memmy-memory
memmy-memory health

CLI за замовчуванням використовує http://127.0.0.1:18960 і приймає --url, --token, --config, --source та --user-id. Його підкоманди: init, health, search, add, get і delete, а також виклики сеансу й обробки запитів, які використовують агенти, а не користувачі. memmy-memory search "deploy steps" і memmy-memory add "staging migrates on deploy" — це дві команди, які агент запускає найчастіше.

Як підключити Claude Code до Memmy?

Claude Code не має інтерфейсу плагінів пам’яті, тому Memmy не підключається до нього напряму. Інтеграція працює простіше. Claude Code запускає memmy-memory як звичайну shell-команду, а файл інструкцій визначає, коли це робити. Задокументований інсталятор Memmy створює цей файл за вас: memmy-memory init --agent додає файл інструкцій щодо пам’яті до каталогу правил цільового агента.

Один раз створіть інструкцію вручну, щоб точно знати, що саме отримав агент. Claude Code читає CLAUDE.md з кореня проєкту на початку кожного сеансу, тому для інтеграції достатньо такого розділу:

## Memory

Before starting a task, run `memmy-memory search "<topic>"` and read what comes back.
When a task is done, run `memmy-memory add "<what you learned>"` for anything that will matter next session.

Чітко визначте, що саме це дає. Це інтеграція на рівні інструкцій, тому вона працює лише тоді, коли модель вирішує виконати команду. Виклик не є примусовим. Якщо сеанс завершився без add, дані не збережено. Наступного разу під час пошуку єдиним сигналом буде порожній результат. Це такий самий компроміс, як і з власними файлами пам’яті Claude Code, але є одна відмінність: сховище спільне, тому ця нотатка також доступна для Codex і Cursor на тому самому комп’ютері.

Зворотний напрямок не потребує жодного налаштування. Сканер Memmy вже читає ~/.claude/projects/**/*.jsonl — саме туди Claude Code записує стенограми сеансів. Запустіть Memmy на тому самому сервері, де ви запускаєте Claude Code у сеансі tmux, і вчорашня робота стане доступною в пам’яті без додаткового налаштування.

Чи працює Memmy як сервер MCP для Claude Code?

Ні. Розуміння цього заощадить час. MCP (протокол контексту моделі) має клієнти та сервери. Memmy — це клієнт. Він підключається до серверів MCP і надає їхні інструменти власному середовищу виконання агента. Він не публікує кінцеву точку MCP, до якої може підключитися claude mcp add. Єдиний міст MCP у репозиторії належить інтеграції Composio у локальному API настільного застосунку. Цей API прив’язується до випадкового порту на 127.0.0.1 і використовує власний заголовок x-memmy-mcp-token.

Сторону клієнта налаштовано у ~/.memmy/config.yaml. Файл, на який вказує MEMMY_CONFIG, розташований у tools.mcpServers:

tools:
  mcpServers:
    example:
      type: stdio
      command: npx
      args:
        - "-y"
        - "your-mcp-server"
      toolTimeout: 30
      enabledTools:
        - "*"

type приймає stdio, sse і streamableHttp. Сервер stdio запускається як дочірній процес Memmy. Тому його команда має існувати на тому самому комп’ютері та виконуватися від імені того самого користувача. Якщо ви вже підтримуєте сервери MCP, що працюють на VPS, саме їх потрібно вказати тут.

Збереження сховища пам’яті приватним

Усе, чим володіє Memmy, зберігається в ~/.memmy: config.yaml, робоча область, memory-service/memory.sqlite і файли середовища виконання. Сканування та індексація виконуються локально, а спогади записуються до цього локального файлу SQLite, тому типовий режим роботи справді є локальним.

Два шляхи звертаються до мережі. MEMMY_CLOUD_SERVICE за замовчуванням має значення https://memmy-api.memtensor.cn і використовує пробні токени для режиму облікового запису, тому режим ключа API до нього не звертається. Програма вдосконалення пам’яті є окремим перемикачем у налаштуваннях конфіденційності. Вона вимкнена, доки ви її не ввімкнете.

Є і третій шлях, який легко пропустити. Якщо налаштувати розміщеного постачальника embedding, текст кожного спогаду надсилається цьому постачальнику, щоб перетворити його на вектор. Локальне зберігання тут не допомагає. Єдиний спосіб повністю закрити цей шлях — розмістити endpoint embedding самостійно.

Залиште порт 18960 прив’язаним до loopback-адреси. Правило firewall не потрібне, оскільки служба, прив’язана до 127.0.0.1, взагалі недоступна з-поза цього комп’ютера. Отримуйте до неї доступ зі свого ноутбука через SSH:

ssh -N -L 18960:127.0.0.1:18960 you@your-vps

Якщо ви коли-небудь прив’яжете її до ширшої адреси, спочатку встановіть токен. Встановлення storage.token у конфігурації або змінної середовища MEMMY_MEMORY_TOKEN чи MEMORY_SERVICE_TOKEN змушує кожен endpoint, крім health, вимагати bearer token. Значення конфігурації підтримують посилання ${ENV_NAME}, тому токен і ключі API ваших моделей залишаються поза самим файлом. Це та сама практика, що й зберігання секретів поза AI-агентами в інших місцях, а політика ufw із типовою забороною є додатковим захистом, якщо майбутня версія змінить типову адресу прив’язки.

Створіть резервну копію ~/.memmy, перш ніж довіряти йому

memory.sqlite — це все сховище. Вектори зберігаються в цьому самому файлі через розширення sqlite-vec, тому резервною копією є один файл. Копіювання за допомогою cp під час запису службою може призвести до пошкодженої бази даних. Використовуйте власну команду резервного копіювання SQLite:

mkdir -p ~/memmy-backup
sqlite3 ~/.memmy/memory-service/memory.sqlite ".backup '$HOME/memmy-backup/memory.sqlite'"

Ця команда створює узгоджену копію, поки служба продовжує працювати. Регулярно передавайте її на інший сервер. Для цього призначено restic для віддаленого сховища. Втрата config.yaml означає втрату налаштувань провайдера, які можна ввести повторно. Втрата memory.sqlite означає втрату всіх спогадів, і на машині більше немає іншої копії.

Запускайте сервіс пам’яті через systemd

npm run memory:serve:dev у командній оболонці завершується разом із нею. Файл unit забезпечує роботу сервісу після перезавантаження.

[Unit]
Description=Memmy memory service
After=network-online.target

[Service]
Type=simple
User=memmy
WorkingDirectory=/opt/memmy/memmy-agent
EnvironmentFile=/etc/memmy/memory.env
ExecStart=/usr/bin/npm run memory:serve:dev
Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target

Не зберігайте токен у unit. Розмістіть його у /etc/memmy/memory.env. Власником має бути root, режим доступу — 600:

MEMMY_CONFIG=/home/memmy/.memmy/config.yaml
MEMMY_MEMORY_TOKEN=replace-this-with-a-long-random-string
sudo systemctl daemon-reload
sudo systemctl enable --now memmy-memory
systemctl status memmy-memory --no-pager
curl -sS http://127.0.0.1:18960/api/v1/health

status=203/EXEC у виводі status означає, що systemd взагалі не зміг запустити ExecStart. Перевірте which npm: під час встановлення через NodeSource це /usr/bin/npm, а під час використання nvm — шлях під домашнім каталогом користувача. systemd його не знайде. Якщо unit запускається і одразу завершується, помилка сталася всередині npm. Команда journalctl -u memmy-memory -n 50 виведе причину. Механізм такий самий, як для будь-якого іншого сервісу systemd на VPS.

Чого Memmy поки що не робить

  • Немає збірки для Linux. Скрипти пакування охоплюють macOS і Windows, тому workbench, майстер початкового налаштування та панель пам’яті недоступні безпосередньо на сервері.
  • memory:serve:dev запускає точку входу TypeScript через tsx, тобто використовує шлях для розробки. У репозиторії також є memory:serve для скомпільованого виводу. Запустіть npm run без аргументів, щоб перевірити, які саме скрипти є у вашій копії репозиторію.
  • Механізм пошуку формує вікно пошуку з останніх 2,000 векторних рядків, а потім виконує вибір Top-K у межах цього вікна. У дуже великому сховищі стара пам’ять може опинитися за його межами.
  • Векторизація відбувається після захоплення даних, а в разі помилки запис потрапляє до черги повторних спроб, а не блокує поточний хід агента. Пам’ять, додана щойно, може бути ще недоступною для векторного пошуку.
  • Один файл SQLite відповідає одному вузлу. Кластеризації немає, тому другий сервер має окрему пам’ять.

Версія 1.0.4 і приблизно 329 зірок станом на July 2026 свідчать, що це молодий проєкт. Прапорці, шляхи та назви скриптів змінюються між випусками. Перевіряйте поле bin і вивід npm run у власній копії репозиторію, а не покладайтеся на команду, скопійовану з будь-якого джерела, зокрема з цього матеріалу.

FAQ

Чому перевірка працездатності повертає відмову в підключенні?

На порту 18960 ніхто не прослуховує з’єднання. Код завершення curl 7 разом із Failed to connect to 127.0.0.1 port 18960 означає, що сервіс пам’яті не запущений або завершив роботу під час запуску. Перегляньте вивід термінала або журнал, у якому зафіксовано запуск. Дві найпоширеніші причини: нативний модуль better-sqlite3, несумісний із вашою версією Node, що виправляється за допомогою npm rebuild better-sqlite3, і версія Node нижче 22. Після запуску сервісу перевірте сокет за допомогою ss -lntp | grep 18960.

Звідки походить команда memmy-memory після збирання з вихідного коду?

Із поля bin пакета робочого простору @memmy/memory, а не з назви репозиторію. Виконайте node -p "JSON.stringify(require('./Memory/package.json').bin)" у каталозі робочої копії. Команда виведе {"memmy-memory":"./dist/src/cli/index.js"}. Цей файл з’являється лише після npm run memory:build, оскільки збирання створює dist і позначає файл як виконуваний. Запускайте його як node Memory/dist/src/cli/index.js health або створіть на нього символічне посилання в /usr/local/bin, щоб використовувати коротку назву.

Чи можна додати Memmy до Claude Code за допомогою claude mcp add?

Ні. Memmy — це MCP-клієнт, а не MCP-сервер. Він підключається до серверів, перелічених у tools.mcpServers у файлі ~/.memmy/config.yaml, і надає їхні інструменти власному середовищу виконання. Claude Code взаємодіє з Memmy в інший спосіб: запускає CLI memmy-memory як команду оболонки згідно з файлом інструкцій, який memmy-memory init --agent записує до каталогу правил агента.

Чи надсилає запуск Memmy мої спогади до хмарного сервісу?

Сканування та імпорт виконуються локально, а спогади записуються до ~/.memmy/memory-service/memory.sqlite на вашому власному диску. MEMMY_CLOUD_SERVICE використовує https://memmy-api.memtensor.cn для режиму облікового запису та пробних токенів, а програма покращення пам’яті залишається вимкненою, доки ви її не ввімкнете. Зверніть увагу на постачальника векторних представлень: розміщена модель векторних представлень отримує текст кожного спогаду, який вона перетворює на вектор. Якщо це важливо, використовуйте кінцеву точку, яку ви розгорнули самостійно.