rag-blob-mcp
RAG Blob MCP
Сервер Model Context Protocol (MCP), который предоставляет RAG-агенту поисковый доступ к библиотеке документов, хранящейся в Azure Blob Storage, а также приложение Streamlit для загрузки документов и общения с ними.
MCP-сервер — FastMCP поверх Streamable HTTP, владеет всем доступом к Azure Blob Storage, предоставляет 4 инструмента и 3 шаблона подсказок, хранит векторный индекс в памяти (эмбеддинги OpenAI), пересобираемый из Blob Storage при каждом запуске.
Приложение Streamlit — вкладка «Библиотека» (загрузка / список / удаление документов) и вкладка «Чат» (задавайте вопросы, на которые отвечает агент LangGraph ReAct, вызывающий инструмент поиска сервера).
Быстрый старт
1. Предварительные требования
Python 3.11+ (разрабатывалось на 3.13)
Учетная запись Azure Storage с контейнером Blob (см. Настройка Azure ниже, если у вас её нет)
Ключ API OpenAI
2. Установка
Из корня репозитория:
python -m venv .venv
.venv\Scripts\activate # Windows
pip install -r requirements.txt3. Настройка
Скопируйте .env.example (в корне репозитория) в .env и заполните свои значения:
OPENAI_API_KEY=sk-...
AZURE_STORAGE_CONNECTION_STRING=DefaultEndpointsProtocol=https;AccountName=...;AccountKey=...;EndpointSuffix=core.windows.net
AZURE_STORAGE_CONTAINER_NAME=rag-documentsВсё остальное (OPENAI_MODEL, OPENAI_EMBEDDING_MODEL, MCP_SERVER_HOST/PORT/URL) имеет рабочие значения по умолчанию — см. Конфигурация.
4. Запуск
Два процесса, два терминала, оба из корня репозитория:
# Terminal 1 — MCP server
python server/mcp_server.py# Terminal 2 — Streamlit app
streamlit run app/streamlit_app.pyОткройте http://localhost:8501. Загрузите файл PDF/DOCX/TXT/MD на вкладке Библиотека, затем задайте вопрос о нём на вкладке Чат.
Related MCP server: Legal MCP Server
Настройка Azure
Если у вас ещё нет учетной записи хранения:
Портал Azure → Создать ресурс → Учетная запись хранения. Стандартная производительность, избыточность LRS подойдёт для личного использования.
В новой учетной записи: Хранилище данных → Контейнеры → + Контейнер, назовите его (например,
rag-documents), уровень доступа — Private.Безопасность и сеть → Ключи доступа → Показать ключи, скопируйте строку подключения.
Вставьте её в
.envкакAZURE_STORAGE_CONNECTION_STRINGи установитеAZURE_STORAGE_CONTAINER_NAMEна имя выбранного контейнера.
Структура проекта
.
├── server/
│ ├── mcp_server.py # FastMCP server: tools, prompts, index rebuild, __main__ entrypoint
│ ├── blob_store.py # Azure Blob Storage wrapper
│ ├── indexing.py # text extraction (pdf/docx/txt/md) + chunking
│ ├── vector_index.py # in-memory vector store wrapper
│ └── test_*.py # automated tests (pytest)
├── agent/
│ └── rag_agent.py # LangGraph ReAct agent used by the Chat tab
├── app/
│ ├── mcp_client.py # direct MCP tool-call helpers used by the Library tab
│ └── streamlit_app.py # the UI
├── scripts/
│ └── smoke_test_server.py # manual end-to-end smoke test against a running server
├── docs_build/ # scripts that generate PROJECT.docx / PROJECT.pdf
└── pytest.iniКонфигурация
Все переменные находятся в файле .env в корне репозитория:
Переменная | По умолчанию | Назначение |
| — (обязательно) | Чат-модель + эмбеддинги |
|
| Чат-модель для RAG-агента |
|
| Модель эмбеддингов для векторного индекса |
| — (обязательно) | Доступ к Blob Storage |
| — (обязательно) | Контейнер, в котором хранятся документы |
|
| Интерфейс, к которому привязывается MCP-сервер |
|
| Порт, к которому привязывается MCP-сервер |
|
| URL, к которому подключаются приложение/агент Streamlit — обновите его, если меняете порт |
Использование
Вкладка «Библиотека» — загружайте файлы PDF/DOCX/TXT/MD (лимит 200 МБ, задаётся Streamlit). Каждая загрузка разбивается на фрагменты, эмбеддится и добавляется в поисковый индекс; список документов показывает статус indexed / failed / pending с количеством фрагментов. Удаление убирает документ и из Blob Storage, и из индекса.
Вкладка «Чат» — задайте вопрос на простом английском. Агент решает, когда вызывать инструмент поиска, извлекает релевантные фрагменты и отвечает, ссылаясь на исходный документ по имени файла. При пустой или нерелевантной библиотеке он сообщает об этом, а не угадывает.
Тестирование
pytest server/ -v29 тестов покрывают извлечение текста/разбиение на фрагменты, векторный индекс, обёртку Azure Blob Storage (мок) и все 4 инструмента MCP + подсказки (через fastmcp.Client в процессе, с использованием заглушек — без реальных вызовов Azure/OpenAI). Автоматического покрытия для UI Streamlit или живой связки агент/сервер нет; см. scripts/smoke_test_server.py для ручного смоук-теста против реально запущенного сервера.
Известные ограничения
Индекс в памяти, без персистентности. Каждый перезапуск сервера заново скачивает, извлекает и эмбеддит каждый документ в контейнере. Подходит для небольшой личной библиотеки; требует реальных вызовов API OpenAI и времени на запуск по мере роста библиотеки.
Однопользовательский, только локально. Нет аутентификации, нет защиты от одновременных записей, нигде не развёрнут.
Оба процесса (MCP-сервер, приложение Streamlit) должны быть запущены для работы приложения — см. полную документацию проекта для подробностей.
Полную картину — архитектуру, проектные решения, известные ошибки и следующие шаги — см. в PROJECT.md (также доступен как PROJECT.docx / PROJECT.pdf).
This server cannot be deployed
Maintenance
Related MCP Connectors
Ingest, manage, and retrieve documents for RAG-powered AI applications
Document hosting and encrypted agent memory with multi-tenant persistence.
LLM Orchestration Agent (Langgraph)
Artifact store for AI agents — read, write, and search files by path; share by rendered URL.
Related MCP Servers
- AlicenseAqualityDmaintenanceEnables AI systems to perform full-text and semantic search operations over structured/unstructured data in Azure Cognitive Search, with capabilities for document indexing and management through natural language.325 npm4ISC
- FlicenseNot gradedqualityDmaintenanceEnables legal document analysis using Azure Blob Storage and Anthropic Claude API with streaming capabilities, prompt library management, and document retrieval for PDF files.-
- AlicenseNot gradedqualityDmaintenanceEnables Claude to search and retrieve documents from Azure AI Search indexes with intelligent summarization and analysis using LangGraph workflows and optional Google Gemini integration.MIT
- FlicenseNot gradedqualityDmaintenanceEnables listing image blobs from Azure Blob Storage and generating descriptions using Azure OpenAI's gpt-4o vision model.6-