policy-rag-mcp-server
Ассистент вопросов и ответов по политическим документам — RAG + MCP-сервер (LangChain, Azure AI Foundry, PostgreSQL/pgvector, Docker, Langfuse)
Ассистент для ответов на вопросы по реальным австралийским государственным политическим документам (финансовая/ИКТ-политика правительства Квинсленда и федеральные налоговые руководства ATO), реализованный как конвейер Retrieval-Augmented Generation (RAG) и представленный как MCP-сервер (Model Context Protocol) — чтобы его можно было подключать к Claude Desktop или любому другому MCP-совместимому клиенту как вызываемый инструмент, а не просто одноразовый скрипт. Весь конвейер, от загрузки PDF до самого инструмента, работает в контейнерах Docker и полностью инструментирован трассировкой Langfuse.
ЦЕЛЬ
Создан для закрытия конкретного набора пробелов в навыках AI-инженера, выявленных при недавних откликах на вакансии (Queensland Treasury, Warren and Mahoney, McCosker, CI&T, Datacom) — инструменты агентов через MCP, оркестрация на LangChain, настоящая векторная база данных (не встроенное/игрушечное хранилище), контейнеризация, именованная облачная AI-платформа (конкретно Azure AI Foundry, а не просто «ключ OpenAI API») и наблюдаемость LLMOps. Вместо сбора сертификатов целью было создать одну реальную, работающую, сквозную систему, демонстрирующую все шесть аспектов на практике — тот же подход, что и в родственном проекте lead-scoring-databricks-pipeline.
Само приложение отражает реалистичный корпоративный сценарий: «позволить сотрудникам задавать вопросы на естественном языке по нашим собственным политическим документам, при этом каждый ответ можно проследить до реальной страницы источника» — тематически релевантно для ролей, связанных с государственным сектором.
Related MCP server: AusLaw MCP
ИСПОЛЬЗУЕМЫЙ НАБОР ДАННЫХ
8 реальных PDF-документов (всего 162 страницы), взятых непосредственно с официальных доменов .gov.au — без сторонних зеркал:
FAH_Volume_1_Introduction_2025.pdf— Справочник по финансовой подотчётности Квинсленда, том 1Overview-of-Queensland-Financial-Accountability-Framework-as-at-Jan-2020.pdfict-as-a-service_decision_framework-overview_v1_0_0.pdfpaf-policy-overview.pdf/paf-supporting-guidelines.pdf— Структура обеспечения проектов Квинсленда (включая государственно-частные партнёрства)n75057 [DE-81739] - 2026 Tax Time toolkit for small business_DIGITAL.pdf— ATOn75127 [DE-73758] - Residency for tax purposes - factsheet_DIGITAL.pdf— ATOtr2023-001.pdf— Налоговое постановление ATO 2023/1
Корпус намеренно разделён на два кластера — политика штата Квинсленд и федеральные налоговые руководства Австралии, — чтобы поиск должен был действительно различать источники уровня штата и федерального уровня, а также официальное постановление и простое изложение смежной темы, а не тривиально совпадать по одному очевидному ключевому слову. Первоначальный набор из 11 документов (344 страницы) был сокращён до этих 8 (162 страницы), чтобы корпус оставался достаточно большим для реальной задачи поиска, но при этом позволял быстро итерировать.
АРХИТЕКТУРА И КОНВЕЙЕР
flowchart LR
subgraph Ingestion["Ingestion (run once, re-run on doc changes)"]
A[Policy PDFs] --> B[Chunking\nLangChain RecursiveCharacterTextSplitter]
B --> C[Embed\nAzure text-embedding-3-small]
C --> D[(PostgreSQL + pgvector\nvia Docker)]
end
subgraph Query["Query time"]
E[MCP Client\ne.g. Claude Desktop] --> F[MCP Server\nPython, containerized]
F --> G[LangChain RAG chain]
G --> D
G --> H[Azure AI Foundry\ngpt-5-mini]
H --> G --> F --> E
end
G -. traces .-> I[Langfuse\nobservability]Загрузка: Каждый PDF загружается постранично с помощью PyPDFLoader из LangChain (с сохранением имени исходного файла и номера страницы в метаданных для последующих цитат), затем разбивается с помощью RecursiveCharacterTextSplitter на 1000 символов / 150 перекрытие — выбрано вместо меньшего разбиения 500/50 после прямого сравнения обоих вариантов на реальном корпусе (950 против 521 чанков); больший размер чанков лучше подходит для этих процедурных, структурно плотных политических документов, давая модели больше окружающего контекста на каждый извлечённый фрагмент. Каждый из 521 полученных чанков встраивается с помощью Azure text-embedding-3-small и записывается в базу данных PostgreSQL, работающую в Docker, при этом расширение pgvector обеспечивает поиск по векторной близости непосредственно внутри реляционной базы данных, а не в отдельном специализированном векторном хранилище — это более производственно-достоверный шаблон, поскольку многие реальные организации добавляют векторный поиск в уже работающий у них экземпляр Postgres.
Время запроса: Вопрос встраивается той же моделью, PostgreSQL возвращает top-4 наиболее похожих чанка по векторной близости, и эти чанки «вставляются» в промпт, который предписывает gpt-5-mini отвечать только на основе этого извлечённого контекста — или говорить «я не знаю», а не полагаться на собственные общие знания. Ответ возвращается вместе с точным исходным документом и номером страницы для каждого чанка, из которого он был взят, так что каждый ответ можно независимо проверить.
Интерфейс: RAG-цепочка обёрнута как MCP-сервер с использованием официального Python MCP SDK, предоставляя два инструмента — query_policy_docs (основная возможность Q&A) и list_indexed_documents (позволяет клиенту показать, что реально покрыто, перед задаванием вопросов). Логика RAG и уровень протокола MCP намеренно хранятся в отдельных файлах, чтобы базовую возможность можно было позже переиспользовать за другим интерфейсом, не трогая её. Сервер контейнеризирован с помощью Docker; поскольку транспорт stdio в MCP требует, чтобы сервер был напрямую подключён к stdin/stdout своего клиента, он запускается как недолговечный контейнер, порождаемый по требованию на каждое соединение (docker compose run --rm -i), в отличие от постоянно работающего контейнера PostgreSQL.
Наблюдаемость: Каждый запрос трассируется от начала до конца с помощью Langfuse — поиск и генерация вложены в одну связанную трассу на каждый вопрос, показывающую точный промпт, извлечённые чанки, задержку и стоимость токенов.
ИСПОЛЬЗУЕМАЯ МОДЕЛЬ
Обе модели развёрнуты через Azure AI Foundry (выбрано намеренно вместо классического типа ресурса «Azure OpenAI», поскольку Foundry явно упоминается в нескольких целевых вакансиях):
gpt-5-mini— генерация,temperature=0для точных, буквальных ответов, основанных на извлечённом тексте, а не творческих.text-embedding-3-small— эмбеддинги, как для корпуса документов, так и для входящих вопросов.
Этот ресурс Foundry использует новый унифицированный API-интерфейс Azure v1 (.../openai/v1), поэтому интеграция использует обычные классы LangChain ChatOpenAI / OpenAIEmbeddings с base_url + api_key + model, а не специфичные для Azure классы AzureChatOpenAI / AzureOpenAIEmbeddings, которые нацелены на старую схему конечных точек с датированной версией API и дают 404 для этого ресурса.
РЕЗУЛЬТАТЫ И ИНСАЙТЫ
Оценено вручную с помощью 5 реальных тестовых вопросов, пропущенных через живую систему:
«Для чего предназначен Справочник по финансовой подотчётности, чтобы помочь агентствам?» → правильный, почти дословный обоснованный ответ с точными цитатами.
«Что помогает решить структура решений по ИКТ-услугам?» → правильный, уловил реальный нюанс (модели развёртывания/обслуживания, оценка рисков).
«Какая столица Франции?» (намеренно вне области охвата) → правильно ответил «я не знаю», а не использовал собственные общие знания модели — ключевой тест против галлюцинаций.
«Что такое государственно-частное партнёрство в соответствии с политикой Квинсленда о ГЧП?» → ответил «я не знаю». Независимо проверено путём прямого просмотра извлечённого текста исходного PDF: документ действительно нигде в своих 23 страницах не определяет этот термин простым языком — реальный, защитимый пробел в корпусе, правильно идентифицированный, а не ошибка поиска или выдуманный ответ.
«Какие обязательства по ведению записей упоминает набор инструментов Tax Time для малого бизнеса?» → правильный, конкретный, с точной цитатой.
5/5 разумное поведение — 3 правильных обоснованных ответа и 2 правильных отказа (один действительно вне области охвата, один — реальный пробел в корпусе, правильно распознанный, а не галлюцинированный). Различение «поиск пропустил нужный чанк» и «в корпусе действительно нет ответа» — это реальный навык оценки RAG, и в этом раунде оба типа сбоев были обработаны правильно — а не просто оценены на глаз как пройдено/не пройдено.
Проверено на реальном MCP-клиенте (Claude Desktop) от начала до конца, как при локальном запуске через .venv, так и полностью в контейнере Docker, при этом каждый запрос трассировался в Langfuse.
НАСТРОЙКА И ИСПОЛЬЗОВАНИЕ
Требования: Docker Desktop, Python 3.13, ресурс Azure AI Foundry с развёрнутыми gpt-5-mini и text-embedding-3-small, и (опционально) бесплатная учётная запись Langfuse Cloud для трассировки.
Скопируйте
.env.exampleв.envи заполните свои учётные данные Azure, Postgres и (опционально) Langfuse.Запустите векторное хранилище:
docker compose up -d postgresЗагрузите документы (однократно или при каждом изменении набора документов):
pip install -r requirements-ingest.txt python embed_and_store.pyЗапустите ассистента напрямую из CLI:
python rag_chain.pyИли подключите его как MCP-инструмент: соберите образ сервера (
docker compose build mcp-server), затем добавьте его в конфигурацию вашего MCP-клиента (например,claude_desktop_config.jsonв Claude Desktop):"policy-rag": { "command": "docker", "args": ["compose", "-f", "<path-to-repo>/docker-compose.yml", "run", "--rm", "-i", "mcp-server"] }
ВЫВОДЫ
Конвейер полностью работает от начала до конца: реальные государственные PDF-файлы разбиваются на чанки, встраиваются и сохраняются в настоящей векторной базе данных; поиск и генерация обоснованы и корректно отказываются отвечать за пределами корпуса; вся возможность представлена как соответствующий стандартам MCP-инструмент, проверенный вживую на реальном MCP-клиенте; сервер контейнеризирован и переносим; и каждый запрос трассируется с указанием стоимости, задержки и полного контекста для наблюдаемости. Каждый уровень, названный как целевой пробел в навыках — MCP, LangChain, настоящая векторная база данных, Docker, Azure AI Foundry и трассировка LLMOps — продемонстрирован работающим, протестированным кодом, а не реализацией только для учебных целей.
ИНФОРМАЦИЯ ОБ АВТОРЕ
Varun Vikas Jaiswal 2026
КЛЮЧЕВЫЕ СЛОВА
RAG, Retrieval-Augmented Generation, LangChain, MCP, Model Context Protocol, Azure AI Foundry, Azure OpenAI, pgvector, PostgreSQL, векторная база данных, поиск по векторной близости, Docker, Docker Compose, Langfuse, LLMOps, наблюдаемость, Python, AI Engineer
This server cannot be installed
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
- -licenseNot gradedqualityNot gradedmaintenanceEnables AI agents to search AustLII (Australian Legal Information Institute) for real Australian legislation and case law. Provides citations with direct links for legal research and verification.
- AlicenseAqualityAmaintenanceEnables users to search and retrieve Australian legislation and case law with full-text content extraction. Provides structured results with citation metadata and OCR support for archival PDFs.122333Apache 2.0
- FlicenseNot gradedqualityNot gradedmaintenanceEnables local indexing and semantic search of PDF documents (like AGLC4 style guide) with OCR support, allowing LLM tools to query PDF content and retrieve relevant text snippets with context.
- FlicenseNot gradedqualityCmaintenanceConnects policy documents to Claude.ai via vector search, allowing natural language querying and retrieval of indexed documents.
Related MCP Connectors
Australian tax knowledge base for agents: 34,500+ ATO documents, cited answers to any tax question.
Query any docs site via MCP. Submit a URL, ask questions, get cited answers.
Resolve, search and verify legal citations against the official sources, with provenance.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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/VarunJaiswal05/policy-rag-mcp-server'
If you have feedback or need assistance with the MCP directory API, please join our Discord server