# Встроить MMW в свой продукт

> Как добавить долговременную память MMW в ваш сервис, бота или внутренний инструмент. Схема с адаптером на вашем сервере, изоляция пользователей, повторы без дублей и выкатка по шагам.

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

К концу страницы у вас будет:

1. схема, по которой продукт обращается к MMW;
2. способ разделить память ваших пользователей;
3. порядок выкатки, при котором сбой MMW не ломает продукт.

## Что остаётся у вас, а что делает MMW

| Ваш продукт | MMW |
| --- | --- |
| Пользователи, вход, права доступа | Хранит факты и решения между сессиями |
| Тарифы и оплата ваших клиентов | Поиск по смыслу и по словам |
| Основные данные и бизнес-логика | Отметки устаревания по источнику (`stale`) |
| Решение, что показать пользователю | Противоречия видны как `conflict`, а не теряются |

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

## Схема

```text
  Интерфейс  →  API вашего продукта  →  MemoryAdapter  →  https://mcp.mmwhub.ru/mcp
                       │
                       └→  ваша БД (пользователи, права, связи с записями MMW)
```

Весь обмен с MMW идёт через один модуль на вашем сервере, назовём его `MemoryAdapter`. В нём:

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

Интерфейс никогда не обращается к MMW напрямую.

## Вызовы

MMW отвечает по протоколу MCP поверх HTTP. Для сервера это обычный POST с JSON-RPC, отдельная инициализация не нужна.

```bash
curl -s https://mcp.mmwhub.ru/mcp \
  -H "Authorization: Bearer $MMW_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"search","arguments":{"query":"способ доставки","workspace":"u-1842","limit":5}}}'
```

Ответ лежит в `result.content[0].text` в виде JSON. Сохранение устроено так же, с `"name":"remember"` и аргументами `content`, `workspace`, `fact_key`, `source_id`, `confidence`. Все параметры описаны в справочнике: [search](/reference/search/), [remember](/reference/remember/), [forget](/reference/forget/).

## Как разделить ваших пользователей

Ключ MMW видит всё в своём проекте. Разделение пользователей внутри проекта делает ваш адаптер, MMW тут вам не поможет.

Есть два способа.

**Рабочая область на пользователя.** Один ключ, привязанный к отдельному проекту продукта. Адаптер сам подставляет `workspace` вида `u-<id пользователя в вашей системе>` и никогда не берёт его из запроса клиента. Подходит большинству продуктов.

**Свой проект на клиента-компанию.** Если ваши клиенты сами компании и им важна строгая изоляция, заведите каждой отдельный проект и ключ. Адаптер выбирает ключ по компании. Ключи храните зашифрованными.

В обоих случаях идентификатор пользователя берите постоянный и неизменный: внутренний id, а не почту или телефон. Сменится почта, а память останется на месте.

## Повторы без дублей

Если адаптер повторяет `remember` после сбоя сети, добавьте заголовок `X-Idempotency-Key`, например хеш от id пользователя и текста факта. Повтор с тем же ключом вернёт ту же запись, а не создаст вторую. Подробно в разделе [Правила для агентов](/memory/best-practices/#повторы-без-дублей-x-idempotency-key).

Для фактов, которые меняются (адрес доставки, тариф клиента), задавайте постоянный `fact_key`, например `customer.delivery.address`. Новая версия пометит старую как заменённую, и поиск вернёт актуальную.

## Выкатка по шагам

1. **Один безопасный сценарий.** Только чтение: перед ответом бот ищет в памяти пользователя и добавляет найденное в контекст модели. Функция за флагом, по умолчанию выключена. Без ключа MMW адаптер просто ничего не находит, продукт работает как раньше. Таймаут вызова 2–3 секунды.

2. **Запись.** Модель сохраняет итог разговора: решение клиента, договорённость, предпочтение. Повторы с `X-Idempotency-Key`. В вашей БД храните id записей MMW рядом с вашими сущностями, а текст записей в свой журнал не пишите.

3. **Удаление по запросу.** Пользователь просит забыть или удаляет аккаунт: адаптер берёт из вашей БД id его записей MMW (их вы сохраняли на шаге 2) и вызывает `forget` по каждому `memory_id`. Это нужно для персональных данных, сделайте это до широкого запуска.

4. **Источники и свежесть.** Если память строится из ваших документов (база знаний, регламенты), передавайте `source_id` и `source_hash`. Когда документ меняется, старые факты получат `stale`.

## Чего не делать

- Не передавайте ключ MMW в браузер, мобильное приложение или промпт модели.
- Не давайте модели самой выбирать `workspace`: его подставляет адаптер.
- Не сохраняйте в память пароли, платёжные данные и сырые выгрузки переписки.
- Не делайте ответ продукта зависимым от MMW: при ошибке или таймауте отвечайте без памяти.

## Лимиты и тарифы

Лимиты на вызовы в минуту и число записей зависят от тарифа, они собраны в разделе [Лимиты](/reference/limits/). Если нужна память для многих тысяч пользователей вашего продукта, напишите на [support@mmwhub.tech](mailto:support@mmwhub.tech): подберём тариф и лимиты.

## Что дальше
