policy-rag-mcp-server
Asistente de Preguntas y Respuestas sobre Documentos de Política — Servidor RAG + MCP (LangChain, Azure AI Foundry, PostgreSQL/pgvector, Docker, Langfuse)
Un asistente de preguntas y respuestas sobre documentos reales de políticas públicas australianas (política financiera/TIC del Gobierno de Queensland y orientación fiscal federal de la ATO), construido como un pipeline de Generación Aumentada por Recuperación (RAG) y expuesto como un servidor MCP (Model Context Protocol) — de modo que se conecta a Claude Desktop o a cualquier otro cliente compatible con MCP como una herramienta invocable, no solo como un script de una sola ejecución. Todo el pipeline, desde la ingesta de PDF hasta la propia herramienta, se ejecuta contenerizado con Docker y está instrumentado de extremo a extremo con trazado de Langfuse.
OBJETIVO
Construido para cerrar un conjunto específico de brechas de habilidades de Ingeniero de IA identificadas en solicitudes de empleo recientes (Queensland Treasury, Warren and Mahoney, McCosker, CI&T, Datacom) — herramientas de agente vía MCP, orquestación basada en LangChain, una base de datos vectorial real (no una tienda integrada/de juguete), contenerización, una plataforma de IA nativa de la nube con nombre (Azure AI Foundry específicamente, no solo "una clave de API de OpenAI"), y observabilidad de LLMOps. En lugar de coleccionar certificados, el objetivo era un sistema real, funcional y de extremo a extremo que demostrara las seis habilidades en la práctica — el mismo enfoque utilizado para el proyecto hermano lead-scoring-databricks-pipeline.
La aplicación en sí refleja un caso de uso empresarial realista: "permitir que el personal haga preguntas en lenguaje natural sobre nuestros propios documentos de política, con cada respuesta trazable hasta una página de origen real" — temáticamente relevante para roles relacionados con el gobierno específicamente.
Related MCP server: AusLaw MCP
CONJUNTO DE DATOS UTILIZADO
8 documentos PDF reales (162 páginas en total), obtenidos directamente de dominios oficiales .gov.au — sin espejos de terceros:
FAH_Volume_1_Introduction_2025.pdf— Manual de Responsabilidad Financiera de Queensland, Vol. 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— Marco de Aseguramiento de Proyectos de Queensland (incl. asociaciones público-privadas)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— Resolución Fiscal de la ATO 2023/1
El corpus está deliberadamente dividido en dos grupos — política estatal de Queensland y orientación fiscal federal australiana — de modo que la recuperación tenga que discriminar genuinamente entre fuentes estatales vs. federales, y entre una resolución formal y un resumen en lenguaje sencillo de un tema relacionado, en lugar de coincidir trivialmente con una única palabra clave obvia. Un conjunto inicial de 11 documentos (344 páginas) se redujo a estos 8 (162 páginas) para mantener el corpus lo suficientemente grande como para ser un problema de recuperación real, mientras se mantiene rápido para iterar.
ARQUITECTURA Y PIPELINE
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]Ingesta: Cada PDF se carga página por página con PyPDFLoader de LangChain (preservando el nombre del archivo fuente + el número de página como metadatos para citas posteriores), luego se divide con RecursiveCharacterTextSplitter a 1000 caracteres / 150 de superposición — elegido sobre una división más pequeña de 500/50 después de comparar ambos directamente en el corpus real (950 vs. 521 fragmentos); el tamaño de fragmento más grande se adapta mejor a estos documentos de política procesales y estructuralmente densos, dando al modelo más contexto circundante por pieza recuperada. Cada uno de los 521 fragmentos resultantes se incrusta mediante text-embedding-3-small de Azure y se escribe en una base de datos PostgreSQL que se ejecuta en Docker, con la extensión pgvector habilitando la búsqueda de similitud vectorial directamente dentro de la base de datos relacional en lugar de una tienda vectorial dedicada separada — un patrón más creíble para producción, ya que muchas organizaciones reales añaden búsqueda vectorial a una instancia de Postgres que ya ejecutan.
Tiempo de consulta: Una pregunta se incrusta con el mismo modelo, PostgreSQL devuelve los 4 fragmentos más similares por similitud vectorial, y esos fragmentos se "rellenan" en un prompt que instruye a gpt-5-mini a responder solo desde ese contexto recuperado — o decir "no lo sé" en lugar de recurrir a su propio conocimiento general. La respuesta se devuelve junto con el documento fuente exacto y el número de página de cada fragmento del que se basó, de modo que cada respuesta sea verificable de forma independiente.
Interfaz: La cadena RAG está envuelta como un servidor MCP usando el SDK oficial de MCP para Python, exponiendo dos herramientas — query_policy_docs (la capacidad central de preguntas y respuestas) y list_indexed_documents (permite que un cliente muestre lo que realmente está cubierto antes de preguntar). La lógica RAG y la capa de protocolo MCP se mantienen en archivos separados a propósito, de modo que la capacidad subyacente pueda reutilizarse detrás de una interfaz diferente más adelante sin tocarla. El servidor está contenerizado con Docker; debido a que el transporte stdio de MCP requiere que el servidor esté conectado directamente a la entrada/salida estándar de su cliente, se ejecuta como un contenedor de corta duración generado bajo demanda por conexión (docker compose run --rm -i), a diferencia del contenedor PostgreSQL siempre activo.
Observabilidad: Cada consulta se traza de extremo a extremo con Langfuse — recuperación y generación anidadas bajo un solo trace conectado por pregunta, mostrando el prompt exacto, los fragmentos recuperados, la latencia y el costo de tokens.
MODELO UTILIZADO
Ambos modelos se despliegan a través de Azure AI Foundry (elegido deliberadamente sobre el tipo de recurso clásico "Azure OpenAI", ya que Foundry se menciona explícitamente en varias ofertas de empleo objetivo):
gpt-5-mini— generación, contemperature=0para respuestas fieles y literales basadas en el texto recuperado en lugar de creativas.text-embedding-3-small— incrustaciones, tanto para el corpus de documentos como para las preguntas entrantes.
Este recurso de Foundry utiliza la superficie de API unificada v1 más nueva de Azure (.../openai/v1), por lo que la integración usa las clases estándar ChatOpenAI / OpenAIEmbeddings de LangChain con base_url + api_key + model, en lugar de las clases específicas de Azure AzureChatOpenAI / AzureOpenAIEmbeddings, que apuntan al esquema de endpoint de versión de API antigua y devuelven 404 contra este recurso.
RESULTADOS Y PERSPECTIVAS
Evaluado manualmente con 5 preguntas de prueba reales ejecutadas a través del sistema en vivo:
"¿Para qué está diseñado el Manual de Responsabilidad Financiera para ayudar a las agencias?" → correcto, respuesta fundamentada casi palabra por palabra con citas precisas.
"¿Qué ayuda a decidir a las agencias el marco de decisión de TIC como servicio?" → correcto, capturó el matiz real (modelos de despliegue/servicio, evaluación de riesgos).
"¿Cuál es la capital de Francia?" (deliberadamente fuera de alcance) → respondió correctamente "no lo sé" en lugar de usar el conocimiento general del propio modelo — la prueba clave contra la alucinación.
"¿Qué es una asociación público-privada según la política de APP de Queensland?" → respondió "no lo sé." Verificado de forma independiente inspeccionando directamente el texto extraído del PDF fuente: el documento genuinamente nunca define el término en lenguaje sencillo en ninguna de sus 23 páginas — una brecha real y defendible del corpus identificada correctamente, no un fallo de recuperación ni una respuesta inventada.
"¿Qué obligaciones de mantenimiento de registros menciona el kit de herramientas de Tax Time para pequeñas empresas?" → correcto, detalle específico, cita precisa.
5/5 comportamiento sensato — 3 respuestas fundamentadas correctas y 2 rechazos correctos (uno genuinamente fuera de alcance, uno una brecha real del corpus reconocida correctamente en lugar de alucinada). Distinguir "la recuperación no encontró el fragmento correcto" de "el corpus genuinamente no contiene la respuesta" es una habilidad real de evaluación de RAG, y esta ronda demostró que ambos modos de fallo se manejan correctamente — no solo un aprobado/reprobado a simple vista.
Verificado contra un cliente MCP real (Claude Desktop) de extremo a extremo, tanto ejecutándose localmente vía .venv como completamente contenerizado vía Docker, con cada consulta trazada en Langfuse.
CONFIGURACIÓN Y USO
Requisitos: Docker Desktop, Python 3.13, un recurso de Azure AI Foundry con gpt-5-mini y text-embedding-3-small desplegados, y (opcionalmente) una cuenta gratuita de Langfuse Cloud para trazado.
Copia
.env.examplea.envy completa tus propias credenciales de Azure, Postgres y (opcionalmente) Langfuse.Inicia la tienda vectorial:
docker compose up -d postgresIngiere los documentos (una sola vez, o cada vez que cambie el conjunto de documentos):
pip install -r requirements-ingest.txt python embed_and_store.pyEjecuta el asistente directamente desde la CLI:
python rag_chain.pyO conéctalo como herramienta MCP: construye la imagen del servidor (
docker compose build mcp-server), luego agrégalo a la configuración de tu cliente MCP (por ejemplo,claude_desktop_config.jsonde Claude Desktop):"policy-rag": { "command": "docker", "args": ["compose", "-f", "<path-to-repo>/docker-compose.yml", "run", "--rm", "-i", "mcp-server"] }
CONCLUSIONES
El pipeline funciona completamente de extremo a extremo: los PDF gubernamentales reales se dividen en fragmentos, se incrustan y se almacenan en una base de datos vectorial real; la recuperación y la generación están fundamentadas y rechazan correctamente responder más allá del corpus; toda la capacidad se expone como una herramienta MCP conforme a estándares, verificada en vivo contra un cliente MCP real; el servidor está contenerizado y es portátil; y cada consulta se traza con costo, latencia y contexto completo para observabilidad. Cada capa nombrada como brecha de habilidad objetivo — MCP, LangChain, una base de datos vectorial real, Docker, Azure AI Foundry y trazado de LLMOps — se demuestra con código funcional y probado, no solo una implementación de tutorial.
INFORMACIÓN DEL AUTOR
Varun Vikas Jaiswal 2026
PALABRAS CLAVE
RAG, Generación Aumentada por Recuperación, LangChain, MCP, Model Context Protocol, Azure AI Foundry, Azure OpenAI, pgvector, PostgreSQL, base de datos vectorial, búsqueda de similitud vectorial, Docker, Docker Compose, Langfuse, LLMOps, observabilidad, Python, Ingeniero de IA
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