Каждый новый чат начинается с агента, который забыл ваши документы. Он может перечитать их, затрачивая время и контекст, или обратиться к чему‑то, что помнит. GroupDocs.Search.Mcp хранит именованный полнотекстовый индекс на диске, локально, который сохраняется между сеансами и перезапусками контейнера, поэтому Claude Desktop, Cursor или Copilot начинают каждый сеанс с уже доступными для поиска документами проекта и обновляют их одним вызовом, когда файлы меняются:

Я отредактировал некоторые контракты. Обновите индекс контрактов, а затем скажите, какие контракты теперь упоминают штраф.

Пошаговая версия с конфигурацией и устранением неполадок находится в документации: Как поддерживать актуальность индекса документов при изменении файлов.

Что означает «память» для агента?

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

session 1    add_to_index --> index "contracts" --+
                                                 |  kept on disk in
session 2    search, get_text_fragments <--------+  /data/.groupdocs-search-
             (nothing is re-read)                    index/contracts
files edit   update_index --> re-reads changed, added, deleted files only
new project  create_index {"indexName":"legal-2026"} --> a separate index

Как работает обновление?

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

-> get_index_info {"indexName":"contracts"}
<- { "documentCount": 5, "indexedPaths": [ "contracts" ],
     "documentsWithErrors": [], "status": "Ready" }

-> update_index {"indexName":"contracts"}
<- Index 'contracts' updated: 0 added, 1 updated, 0 removed;
   5 document(s) in the index.

-> search {"query":"penalty","indexName":"contracts"}
<- documentsFound 3, including the edited initech-nda.docx

Счётчики показывают, что произошло: один файл перечитан, ничего больше не тронуто. Удалённые файлы исчезают тем же вызовом.

Почему один индекс на проект?

Потому что отдельные корпуса заслуживают отдельных ответов. Вопрос о контрактах текущего года не должен показывать черновики прошлого года, а документы одного клиента не должны смешиваться с документами другого клиента. Имена индексов дешёвые:

-> create_index {"indexName":"legal-2026"}
<- Index 'legal-2026' created. Add documents with add_to_index
   (indexName: 'legal-2026').

Каждый индекс — это папка в /data/.groupdocs-search-index, а get_index_info без указания имени выводит их все. Обычно create_index вызывать не нужно, потому что add_to_index создаёт индекс при первом использовании, но намеренное именование превращает «индекс» в «память этого проекта».

Единственное правило об удалении

Движок удаляет пути, которые были добавлены, а не отдельные файлы внутри них. Сервер явно сообщает об этом, когда вы пытаетесь:

-> remove_from_index {"documentPath":"contracts/hooli-supply-terms.txt",...}
<- Removal failed for 'contracts/hooli-supply-terms.txt':
   'contracts/hooli-supply-terms.txt' is inside the indexed folder
   'contracts'. GroupDocs.Search removes whole indexed paths only: ...

Поэтому планируйте так: если вы планируете позже избавиться от части корпуса, например года, клиента или черновиков, индексируйте эти части как отдельные пути (contracts/2025, contracts/2026) — их можно будет удалить по отдельности. Удаление файла с диска и запуск update_index также удалит его из индекса.

Поддержание актуальности без запросов

create_index (optional)
      |
      v
add_to_index ---> search ---> get_text_fragments
      ^              ^
      |              |  get_index_info: counts, paths, status
update_index  (files changed on disk)
      |
remove_from_index  (only a path that was given to add_to_index)

Три практических способа автоматизировать обновление:

  1. В инструкциях агента. Строка в CLAUDE.md или AGENTS.md: «вызвать update_index для индекса этого проекта перед ответом, если файлы могли измениться», заставит агента выполнить это в начале сеанса.
  2. По расписанию. Любая автоматизация, поддерживающая MCP, может вызывать update_index каждую ночь; когда изменений мало, вызов проходит быстро.
  3. После массовой копии. Один вызов подхватывает каждый добавленный файл.

Индексы также переживают обновления: индексы, построенные GroupDocs.Search 22.7‑26.8, конвертируются при первом использовании, при этом рядом сохраняется резервная копия.

Что решает агент, а что делает индекс

Что решает агент Что делает индекс
к какому индексу относится вопрос хранит каждый именованный индекс в отдельной папке
когда файлы могли измениться перечитывает только изменённые, добавленные и удалённые файлы
какие слова искать и какие варианты пробовать сопоставляет слова, фразы, диапазоны; сообщает найденные термины
сколько контекста цитировать возвращает отрывки с запрошенным количеством слов вокруг
что сказать вам ничего: возвращает счётчики, пути и текст, но не выводы

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

Честные ограничения

  • В режиме оценки индекс хранит не более 100 документов, а поиск возвращает не более 10. Вызовите get_license_status перед тем, как полагаться на индекс как на источник истины.
  • Индекс сохраняется только если /data (или том индекса) смонтирована как папка хоста; иначе он исчезает вместе с контейнером.
  • Индекс содержит текст документов: защищайте и утилизируйте его так же, как и сами документы.
  • Только Docker; в Linux добавьте --user "$(id -u):$(id -g)", чтобы контейнер мог записывать индекс.

FAQ

Помнит ли агент мои документы между сеансами?
Да, при наличии постоянного индекса: индекс остаётся на диске, и следующий сеанс ищет в нём без перечитывания файлов.

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

Можно ли хранить индекс отдельно от документов только для чтения?
Да. Смонтируйте документы только для чтения, смонтируйте записываемую папку в /index и задайте GROUPDOCS_MCP_INDEX_PATH=/index.

Углубиться