Skip to main content
Glama
VarunJaiswal05

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. 1

  • Overview-of-Queensland-Financial-Accountability-Framework-as-at-Jan-2020.pdf

  • ict-as-a-service_decision_framework-overview_v1_0_0.pdf

  • paf-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 — ATO

  • n75127 [DE-73758] - Residency for tax purposes - factsheet_DIGITAL.pdf — ATO

  • tr2023-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, con temperature=0 para 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:

  1. "¿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.

  2. "¿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).

  3. "¿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.

  4. "¿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.

  5. "¿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.

  1. Copia .env.example a .env y completa tus propias credenciales de Azure, Postgres y (opcionalmente) Langfuse.

  2. Inicia la tienda vectorial: docker compose up -d postgres

  3. Ingiere los documentos (una sola vez, o cada vez que cambie el conjunto de documentos):

    pip install -r requirements-ingest.txt
    python embed_and_store.py
  4. Ejecuta el asistente directamente desde la CLI: python rag_chain.py

  5. O 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.json de 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

F
license - not found
Not graded
quality - not tested
C
maintenance

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

  • A
    license
    A
    quality
    A
    maintenance
    Enables 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.
    12
    23
    33
    Apache 2.0
  • F
    license
    Not graded
    quality
    Not graded
    maintenance
    Enables 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.

View all related MCP servers

Related MCP Connectors

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/VarunJaiswal05/policy-rag-mcp-server'

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