Skip to main content
Glama
mustafa0zdemir

CorpusGate

CorpusGate

Приватный документный шлюз, готовый к работе с LLM, на базе MarkItDown и MCP.

Преобразовывайте, индексируйте и получайте приватные документы для ИИ-инструментов, не отправляя содержимое документов сторонним сервисам.

CorpusGate — это универсальный, самостоятельно размещаемый Document MCP Server для отдельных пользователей и команд, которым нужен контролируемый доступ ИИ-инструментов к документам на собственной инфраструктуре. MarkItDown преобразует поддерживаемые файлы в повторно используемый Markdown. Шлюз разбивает этот Markdown на чанки и индексирует их, а MCP возвращает только релевантные чанки с указанием источника в рамках принудительных лимитов сервера.

Самостоятельное размещение оставляет исходные документы, сгенерированный Markdown, запросы, метаданные и индексы под контролем оператора. Сокращение токенов достигается за счёт ограниченной выдачи и выбора чанков, а не только за счёт MarkItDown. Этот проект — не чат-бот, не генератор ответов LLM, не продукт для анализа контрактов, не SaaS-платформа и не пользовательская панель документов.

Возможности

  • Преобразование PDF, DOCX, PPTX, XLSX, TXT, Markdown и HTML через Microsoft MarkItDown.

  • Постоянный кэш Markdown, чанки с учётом токенов и сохранением заголовков, дедупликация по SHA-256.

  • Лексический поиск SQLite FTS5/BM25 в облегчённой установке по умолчанию.

  • Опциональный многоязычный семантический поиск только на CPU и гибридный поиск RRF на основе локальных эмбеддингов.

  • Ограниченные ответы MCP с метаданными источника/позиции, курсорами, дедупликацией и лимитами соседних фрагментов.

  • Аутентификация REST по API-ключу и MCP по Bearer-токену, безопасное хранение UUID, защита путей/симлинков, ограничение частоты запросов и структурированные логи без содержимого.

  • Защищённое развёртывание Docker и Compose для AMD64/ARM64, Oracle Cloud, Tailscale или Caddy HTTPS.

  • Помощник настройки, операционные команды doctor/scan/reindex/backup, версионируемая схема SQLite и CI.

Related MCP server: rag-retriever-mcp

Как это работает

REST upload or read-only inbox scan
        │
        ├─ type, signature, size, path, and free-space validation
        ├─ UUID storage + SHA-256 ── unchanged? ── reuse cached/indexed record
        │
        └─ MarkItDown ──> persistent Markdown ──> token-aware chunks
                                                   │
                              ┌────────────────────┴────────────────────┐
                              │                                         │
                    SQLite FTS5 / BM25                      optional local embeddings
                              │                                  + private Qdrant
                              └────────────────────┬────────────────────┘
                                                   │
                               ranking → dedup → token/char budget → MCP

Код держит контракты парсинга, хранения, репозитория, разбиения на чанки, эмбеддинга, векторного хранилища и поиска за интерфейсами, не превращая однострочный продукт в распределённую систему. Документы остаются основным источником данных; индексы Markdown и векторные индексы можно перестроить.

Поддерживаемые форматы

Язык

Расширения

Примечания

PDF

.pdf

Текстовые PDF; в 0.1.0 внешний OCR отсутствует.

Word

.docx

Проверяется структура архива Office.

PowerPoint

.pptx

Маркеры слайдов сохраняются, когда их выдаёт MarkItDown.

Excel

.xlsx

Заголовки листов переносятся в метаданные чанков при их наличии.

Текст

.txt

UTF-8.

Markdown

.md, .markdown

UTF-8, с учётом заголовков.

HTML

.html, .htm

UTF-8; загрузка удалённых URL намеренно не поддерживается.

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

Быстрый старт

Требования: Docker Engine с Compose v2 и OpenSSL. Python на хосте не требуется.

git clone https://github.com/mustafa0zdemir/corpusgate.git
cd corpusgate
./corpusgate init
./corpusgate up
curl --fail http://127.0.0.1:8000/health
./corpusgate doctor

./corpusgate init создаёт постоянные каталоги и каталог inbox, копирует .env.example только в том случае, если .env ещё не существует, генерирует отдельные случайные учётные данные REST/MCP без их вывода, проверяет Docker/Compose и выбранный порт, а также проверяет сам Compose-файл. Существующий .env никогда не перезаписывается.

Эквивалентный ручной процесс: скопируйте .env.example в .env, замените оба заполнителя учётных данных разными значениями openssl rand -hex 32, затем создайте каталог documents/ и выполните docker compose up -d. Не помещайте .env в систему контроля версий.

Опциональный локальный семантический/гибридный поиск после инициализации включается тоже одной операцией:

./corpusgate init --semantic
./corpusgate up --semantic

Первый семантический запуск загружает модель в постоянный кэш, а затем запускает шлюз в автономном режиме с Qdrant во внутренней сети Docker. При последующих запусках тома модели и векторов не пересоздаются. Лексическая установка не устанавливает и не запускает ни один из семантических компонентов.

Добавление документов

Самый простой сценарий работы оператора — использование доступного только для чтения каталога inbox на хосте:

cp examples/documents/* documents/
./corpusgate scan
./corpusgate list-documents

Сканирование пропускает скрытые/системные/временные файлы, неподдерживаемые типы, каталоги и symlink. Входные файлы остаются в documents/; приватные копии с UUID хранятся в постоянном томе исходников. Полный проход «лексический → семантический/гибридный → MCP» описан в синтетическом демо.

Для сценария с одним файлом, который ИИ-инструменты могут запускать без попадания байтов файла в контекст модели, передайте локальный файл напрямую в запущнный REST API (требуется curl):

./corpusgate upload /absolute/path/to/document.pdf

Команда берёт REST-ключ из CORPUSGATE_CLIENT_API_KEY, CORPUSGATE_API_KEY или локального .env, никогда его не печатает, отклоняет редиректы и небезопасный удалённый HTTP и возвращает только метаданные загрузки API. Для удалённого приватного сервера укажите --url https://YOUR-NODE.YOUR-TAILNET.ts.net.

Загрузка также доступна приложениям через REST:

export CORPUSGATE_CLIENT_API_KEY='value-from-your-env'
curl --fail -X POST http://127.0.0.1:8000/api/v1/documents \
  -H "X-API-Key: ${CORPUSGATE_CLIENT_API_KEY}" \
  -F 'file=@examples/documents/private-network-guide.md'

REST также поддерживает постраничные метаданные, Markdown, чанки, лексический поиск и удаление по адресу /api/v1/documents. Интерактивная документация OpenAPI находится на /docs; защищённые операции по-прежнему требуют X-API-Key.

Подключение MCP-клиента

Удалённая конечная точка — https://YOUR_PRIVATE_OR_PUBLIC_HOST/mcp, и каждый MCP-запрос требует:

Authorization: Bearer YOUR_MCP_TOKEN

В качестве рекомендуемого приватного маршрута используйте Tailscale Serve. Caddy HTTPS — публичная альтернатива; в обоих случаях порт шлюза остаётся доступен только на локальном loopback хоста. Проверенное соответствие полей, команда Inspector, примеры Tailscale/HTTPS и устранение неполадок описаны в руководстве по подключению MCP. Не копируйте непроверенную клиентскую JSON-обёртку и не сохраняйте токен в системе контроля версий.

Инструменты MCP

Инструмент

Назначение

Лимиты и поведение

list_documents

Получение метаданных без содержимого.

offset, limit с ограничением на сервере, has_more.

get_document_metadata

Просмотр записи о документе/статусе/кэше.

Возвращает только metadata, без содержимого.

search_documents

Поиск, когда исходный документ неизвестен.

Mode/filters/top-k/budgets/cursor, заказы, управляемые лимиты.

search_document

Поиск в одном известном документе.

Опционально ограниченные соседние фрагменты.

get_relevant_chunks

Сбор компактного контекстного набора из разрешённого списка.

Дедупликация и контроль бюджета.

get_document_section

Чтение последовательных чанков после нахождения позиции.

Курсор чанка, жёсткие лимиты по токенам/размеру; никогда исходный файл.

refresh_document_index

Идемпотентный ремонт лексического/векторного индекса сохранённого документа.

Возврат счётчиков обслуживания, без содержимого, без загрузки/удаления/переконвертации.

Элементы выдачи последовательно включают document_id, document_name, chunk_id, heading, position, поля релевантности/ранга, ограниченный content, content_length и метаданные режима поиска. Пустая выдача возвращает пустой список items, применённые лимиты, метрики и не содержит курсора. Некорректные режимы, курсоры, фильтры, ID документов или значения сверх лимита приводят к контролируемым ошибкам инструментов. Загрузка и удаление остаются только через REST.

Рекомендуемый порядок действий:

AI tool → search_document(query, top_k=3, max_tokens=600)
        → ranked chunks + source positions + actual retrieval mode
        → optional bounded get_document_section

Лексический, семантический и гибридный поиск

  • lexical — режим по умолчанию для эксплуатации: SQLite FTS5 с BM25, взвешенным по заголовкам, сохраняет точные идентификаторы и фразы без отдельных сервисов.

  • semantic — вычисляет вложения запросов и чанков локально с помощью настраиваемой многоязычной CPU-модели и хранит векторы в приватном Qdrant.

  • hybrid — объединяет независимые лексические и семантические ранги через Reciprocal Rank Fusion; дубликаты чанков выдются один раз, точные лексические совпадения не отбрасываются.

  • lexical_fallback — появляется в ответе, когда запрошены semantic/hybrid, но локальная модель, векторный индекс или хранилище недоступны, и включён фолбэк.

Модель по умолчанию — Apache-2.0 sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2, 384-мерная многоязычная модель, работающая через FastEmbed/ONNX только на CPU. Замену модели, офлайн-перенос, правила переиндексации, замеры и рекомендации по памяти для Oracle см. в документации по семантическому поиску.

Оптимизация токенов

MarkItDown позволяет единообразно разбирать файлы разных форматов; сам по себе он не гарантирует уменьшение числа токенов. Шлюз сокращает возвращаемый контекст за счёт однократного кэширования конвертации, ранжирования чанков, исключения дубликатов, применения top_k, max_chars, оценочного max_tokens, лимита на соседние фрагменты и постраничной выдачи длинных результатов. В нём нет инструмента по умолчанию, который возвращает целый документ или исходный файл.

Число токенов — локальная детерминированная оценка, а не специфический для провайдера биллинговый токенизатор. Повторяемое синтетическое измерение и его точные границы описаны в отчёте об оценке поиска; универсальный процент экономии не заявлен.

Безопасность и конфиденциальность

  • Нет телеметрии; тексты документов, запросы не покидают систему; нет облачного API для эмбеддингов; нет обязательного LLM-провайдера.

  • Исходный файлы хранятся по путям UUID; проверяются path traversal, абсолютные пути, обход через симлинки, скрытые/временные файлы, MIME/сигнатуры, распаковка архивов, размер загрузки и заполнение диска.

  • REST работает через API-ключи; удалённый MCP использует Bearer-токены, сравниваемые за константное время, из окружения или Docker secret. Возможна ротация при наличии нескольких актуальных/предыдущих токенов.

  • Структурированные логи содержат разрешённые операционные метаданные и никогда не содержат содержимое документов, учётных данных, полных запросы или видимые клиенту обрывки стека выполнения.

  • Контейнер шлюза — не-root без capabilities, с no-new-privileges, с корневым диском только для чтения, с явно определёнными writable-томами и tmpfs, с лимитами ресурсов и логов.

  • Базовый Compose публикует только 127.0.0.1:8000; Qdrant доступен только внутри Docker-сети. Публичный доступ требует Caddy TLS и сохраняет Bearer-аутентификацию, rate limit и лимиты ответа.

Хранения включает приватные UUID-копии исходников, сгенерированный Markdown, метаданные/чанки/FTS в SQLite, опциональные локальные векторы/модельный кэш, резервное копии и настройки оператора. Чтобы удалить данные, сначала удалите документы через REST; затем удаляйте постоянные тома только после явного резервного копирования и остановки сервиса. Политика приватного параллельного отчёта об уязвимости — в SECURITY.md.

Развёртывание на Oracle Cloud

Рекомендуемое развёртывание на Oracle Ubuntu связывает приложение с loopback и использует Tailscale Serve для HTTPS в пределах tailnet; для случаев с доменом документирован профиль Caddy public. В Oracle Security Lists/NSG никогда не должны открываться порт TCP 8000 или порт Qdrant 6333.

Подготовка VM, примечания по AMD64/Ampere ARM64, установка Docker, владельца файловой системы, секреты, межсетевые экраны, Tailscale/Caddy, логирование, обновление, резервное копирование, восстановление и диагностика описаны в руководстве по развёртыванию на Oracle.

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

Все переменные окружения приложения, значения прописы, требования, диапазоны, примеры и их влияние на безопасность перечислены в контракте конфигурации и в .env.example. При старте отклоняются отсутствующие/недостаточные учётные данные, недопустимые портфолио и пути, незаконные сочетания чанк/бюджета, неподдерживаемые режимы поиска и неверная конфигурация семантического векторного хранилища; секретные значения не выводятся в эхо.

Операционные команды:

./corpusgate version
./corpusgate status
./corpusgate doctor
./corpusgate mcp-smoke
./corpusgate upload /absolute/path/to/document.pdf
./corpusgate scan
./corpusgate reindex
./corpusgate reindex --semantic
./corpusgate list-documents --limit 20 --offset 0

Резервное копирование и восстановление

./corpusgate backup
./corpusgate restore /backups/corpusgate-backup-TIMESTAMP.tar.gz --confirm-restore

Восстановление заменяет текущие постоянные данные и поэтому требует явного флага подтверждения и остановленного процесса записи в продакшене. Резервные копии включают приватное хранилище исходных документов, кэш Markdown, транзакционно скопированную базу данных SQLite, манифест и пример конфигурации без секретов. Храните .env и файлы токенов в отдельной зашифрованной резервной копии секретов. Векторные данные можно пересоздать из чанков.

Обновление и откат

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

Точные команды и безопасный путь отката/восстановления описаны в документе «Обновление и откат». Никогда не запускайте docker compose down -v во время обычного обновления.

В репозитории также есть ручной workflow GHCR, требующий одобрения. Поведение стабильного тега, перемещаемого минорного тега и latest описано в политике публикации контейнеров; в рамках этого спринта не было опубликовано ни одного образа.

Устранение неполадок

  • ./corpusgate doctor: проверяет конфигурацию, права доступа к хранилищу, SQLite/схему, диск, опциональное состояние модели/векторов, готовность сервиса и версию, не раскрывая секреты.

  • 401: используйте REST X-API-Key или MCP Authorization: Bearer, а не другой тип учётных данных.

  • Отклонение хоста: добавьте точный хост Tailscale/домена в CORPUSGATE_ALLOWED_HOSTS и пересоздайте шлюз.

  • 507: освободите место на диске или пересмотрите порог зарезервированного дискового пространства перед повторной попыткой загрузки.

  • lexical_fallback: проверьте кэш модели и состояние Qdrant; лексический поиск остаётся доступен.

  • Сбой преобразования: проверьте поддерживаемое расширение, MIME/сигнатуру, целостность UTF-8/Office-архива, размер, шифрование и наличие текстового слоя в PDF.

  • Журналы: ./corpusgate logs --tail=100; удаляйте чувствительные данные из вывода перед передачей.

См. SUPPORT.md и руководство по устранению неполадок для конкретного развёртывания, прежде чем открывать issue.

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

Окружение

Статус по v0.1.0

Python

В образе выполнения используется Python 3.12; автоматические тесты нацелены на 3.12.

linux/arm64

Сборка и запуск рантайм- и семантического образов проверены на Docker-хосте с ARM64.

linux/amd64

Мультиархитектурная цель Buildx CI; выпуск требует проверки по чек-листу.

Oracle Cloud Ubuntu

Контракт развёртывания нацелен на Ubuntu 24.04/Ampere; проверка на новой VM остаётся пунктом чек-листа выпуска.

Docker / Compose

Поток ARM64 протестирован с Engine 29.6.2 и Compose 5.3.1; требуется Compose v2.

Лексический поиск

Образ по умолчанию; семантический сервис не требуется.

Семантический поиск

Опциональные образ/тома Qdrant/модели; проверено только на CPU в ARM64.

Офлайн-режим

Лексический поиск работает офлайн; семантический — офлайн после разового заполнения кэша модели.

Непроверенные платформы не подаются как поддерживаемые. Перед публикацией артефактов ознакомьтесь с чек-листом выпуска.

Ограничения

  • Одноузловой SQLite — не высокодоступная и не многозаписывающая СУБД.

  • Загрузка и конвертация синхронны в 0.1.0; для больших документов могут потребоваться более длинные тайм-ауты клиента/прокси.

  • Нет OCR, адаптера облачного хранилища, учётных записей пользователей, UI, генерации ответов, реранкейра, тонкой настройки или SaaS-контроллера.

  • Приблизительные бюджеты токенов могут отличаться от токенизатора конкретной LLM.

  • Загрузка семантической модели требует временного исходящего доступа, если кэш не был перенесён офлайн.

План развития

  • Фоновые задачи конвертации без обязательного Redis для одноузловых пользователей.

  • Опциональные адаптеры PostgreSQL/pgvector и объектного хранилища за существующими интерфейсами.

  • Более активное извлечение метаданных конвертером и управляемый оператором адаптер OCR.

  • Подписанные выпуски, SBOM/происхождение артефактов, расширенные кросс-архитектурные и обновляемые настпробы.

Вклад в разработку

Прочтите CONTRIBUTING.md, следуйте CODE_OF_CONDUCT.md, добавляйте тесты и используйте только синтетические нечувствительные фикстуры. Отчёты об уязвимостях должны использовать приватный канал, указанный в SECURITY.md, и никогда не должны попадать в публичную issue.

Лицензия

CorpusGate выпускается под существующей MIT License. Сторонние библиотеки и опциональная модель эмбеддингов сохраняют свои собственные лицензии.

A
license - permissive license
Not graded
quality - not tested
B
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Servers

  • F
    license
    Not graded
    quality
    B
    maintenance
    Enables any MCP-compatible AI assistant to search, filter, and retrieve information from a local document collection using a hybrid search pipeline with vector, BM25, reranking, and LLM enrichment.
    4
  • F
    license
    A
    quality
    B
    maintenance
    A local-first document retrieval engine that mounts as an MCP tool for agents to index files, search for relevant passages, and let the agent's own LLM answer.
    4
  • F
    license
    Not graded
    quality
    C
    maintenance
    Enables local document question-answering and retrieval via MCP, supporting multi-turn conversation, intent recognition, and tools for document search, Q&A, and summarization.
    5

View all related MCP servers

Related MCP Connectors

  • Multi-engine search for AI agents. Trust scoring, local corpus, MCP-native. Self-hostable, BYOK.

  • Search your AI chat history (ChatGPT, Claude, Codex) from any MCP client. Remote, private, read-only

  • Agentic search over your Dewey document collections from any MCP-compatible client.

View all MCP Connectors

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/mustafa0zdemir/corpusgate'

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