Skip to main content
Glama
VarunJaiswal05

policy-rag-mcp-server

ポリシードキュメントQ&Aアシスタント — RAG + MCPサーバー(LangChain、Azure AI Foundry、PostgreSQL/pgvector、Docker、Langfuse)

オーストラリアの実際の公共政策文書(クイーンズランド州政府の財務/ICTポリシーとATO連邦税務ガイダンス)に対する質問応答アシスタント。検索拡張生成(RAG)パイプラインとして構築され、MCP(Model Context Protocol)サーバーとして公開されています。そのため、Claude Desktopや他のMCP互換クライアントに、一回限りのスクリプトではなく呼び出し可能なツールとして接続できます。PDFの取り込みからツール自体に至るまで、パイプライン全体がDockerでコンテナ化され、Langfuseトレーシングでエンドツーエンドに計装されています。


目的

最近の求人応募(Queensland Treasury、Warren and Mahoney、McCosker、CI&T、Datacom)で特定された、AIエンジニアのスキルギャップの特定セットを埋めるために構築されました — MCPによるエージェントツール、LangChainベースのオーケストレーション、実際のベクターデータベース(組み込み/おもちゃのストアではない)、コンテナ化、名前付きクラウドネイティブAIプラットフォーム(具体的にはAzure AI Foundry。「OpenAI APIキー」だけではない)、そしてLLMOpsの可観測性です。証明書を集めるのではなく、これら6つすべてを実践的に実証する、実際に動作するエンドツーエンドのシステムを1つ作ることを目標としました。これは、姉妹プロジェクトのlead-scoring-databricks-pipelineと同じアプローチです。

アプリケーション自体は、現実的なエンタープライズユースケースを反映しています。「スタッフが自社のポリシー文書に対して自然言語で質問でき、すべての回答が実際のソースページに遡って検証可能である」というもので、特に政府関連の役割にテーマ的に関連しています。


Related MCP server: AusLaw MCP

使用データセット

公式の.gov.auドメインから直接取得した8つの実際のPDF文書(合計162ページ)— サードパーティのミラーはありません:

  • FAH_Volume_1_Introduction_2025.pdf — クイーンズランド州財務説明責任ハンドブック、第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 — クイーンズランド州プロジェクト保証フレームワーク(官民パートナーシップを含む)

  • 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 — ATO税務裁定2023/1

コーパスは意図的に2つのクラスター(クイーンズランド州のポリシーとオーストラリア連邦税務ガイダンス)に分割されているため、検索は単一の明白なキーワードに単純に一致するのではなく、州と連邦のソース、および正式な裁定と関連トピックの平易な要約を真に区別する必要があります。初期の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はLangChainのPyPDFLoaderでページごとに読み込まれ(後で引用するためにソースファイル名とページ番号をメタデータとして保持)、その後RecursiveCharacterTextSplitter1000文字 / 150オーバーラップに分割されます。これは、実際のコーパスで直接比較した後、より小さい500/50分割ではなく選択されました(950チャンク対521チャンク)。より大きなチャンクサイズは、これらの手続き的で構造的に密度の高いポリシー文書に適しており、取得された各ピースに対してモデルにより多くの周囲のコンテキストを与えます。結果として得られた521チャンクのそれぞれは、Azureのtext-embedding-3-smallで埋め込まれ、Dockerで実行されているPostgreSQLデータベースに書き込まれます。pgvector拡張機能により、専用のベクターストアではなく、リレーショナルデータベース内で直接ベクター類似性検索が可能になります。これは、多くの実際の組織が既に実行しているPostgresインスタンスにベクター検索を追加するため、より本番環境で信頼できるパターンです。

クエリ時: 質問は同じモデルで埋め込まれ、PostgreSQLはベクター類似性によって上位4つの最も類似したチャンクを返し、それらのチャンクはgpt-5-mini取得されたコンテキストからのみ回答するように指示するプロンプトに「詰め込まれ」ます。または、独自の一般的な知識に頼るのではなく「わかりません」と言います。回答は、それが引き出したすべてのチャンクの正確なソース文書とページ番号とともに返されるため、すべての回答は独立して検証可能です。

インターフェース: RAGチェーンは、公式のPython MCP SDKを使用してMCPサーバーとしてラップされ、query_policy_docs(中核となるQ&A機能)とlist_indexed_documents(クライアントが質問する前に実際にカバーされている内容を表示できるようにする)の2つのツールを公開します。RAGロジックとMCPプロトコル層は意図的に別々のファイルに保持されているため、基盤となる機能は後で別のインターフェースの背後で再利用できます。サーバーはDockerでコンテナ化されています。MCPのstdioトランスポートではサーバーをクライアントのstdin/stdoutに直接接続する必要があるため、常時稼働のPostgreSQLコンテナとは異なり、接続ごとにオンデマンドで生成される短命のコンテナとして実行されます(docker compose run --rm -i)。

可観測性: すべてのクエリはLangfuseでエンドツーエンドにトレースされます。質問ごとに、取得と生成が1つの接続されたトレースの下にネストされ、正確なプロンプト、取得されたチャンク、レイテンシ、トークンコストが表示されます。


使用モデル

両方のモデルはAzure AI Foundryを介してデプロイされています(古典的な「Azure OpenAI」リソースタイプではなく、意図的にFoundryが選択されました。Foundryはいくつかのターゲット求人情報で明示的に名前が挙げられているためです):

  • gpt-5-mini — 生成、temperature=0で、創造的ではなく取得されたテキストに基づいた忠実で文字通りの回答を実現。

  • text-embedding-3-small — 埋め込み。文書コーパスと受信質問の両方に使用。

このFoundryリソースは、Azureの新しい統合v1 APIサーフェス(.../openai/v1)を使用するため、統合では、古い日付付きAPIバージョンエンドポイントスキームをターゲットとし、このリソースに対して404を返すAzure固有のAzureChatOpenAI / AzureOpenAIEmbeddingsクラスではなく、LangChainの通常のChatOpenAI / OpenAIEmbeddingsクラスをbase_url + api_key + modelとともに使用します。


結果と洞察

ライブシステムで実行された5つの実際のテスト質問で手動評価:

  1. 「財務説明責任ハンドブックは、機関が何を行うのを支援するために設計されていますか?」 → 正しく、ほぼ逐語的な根拠のある回答と正確な引用。

  2. 「ICT-as-a-service決定フレームワークは、機関が何を決定するのを支援しますか?」 → 正しく、実際のニュアンス(展開/サービスモデル、リスク評価)を捉えました。

  3. 「フランスの首都はどこですか?」(意図的に範囲外)→ モデル自身の一般的な知識を使用する代わりに、正しく「わかりません」と回答 — 重要な幻覚防止テスト。

  4. 「クイーンズランド州のPPPポリシーにおける官民パートナーシップとは何ですか?」 → 「わかりません」と回答。ソースPDFの抽出されたテキストを直接検査して独立に検証:文書は23ページのどこにもこの用語を平易な言葉で定義していません — 検索の失敗や捏造された回答ではなく、実際の防御可能なコーパスギャップが正しく特定されました。

  5. 「中小企業向けTax Timeツールキットが言及している記録保持義務は何ですか?」 → 正しく、具体的な詳細、正確な引用。

5/5の賢明な動作 — 3つの正しい根拠のある回答と2つの正しい拒否(1つは本当に範囲外、もう1つは幻覚ではなく正しく認識された実際のコーパスギャップ)。「検索が正しいチャンクを逃した」と「コーパスに実際に回答が含まれていない」を区別することは、実際のRAG評価スキルであり、今回のラウンドでは両方の失敗モードが正しく処理されることを実証しました。単なる目視による合格/不合格ではありません。

実際のMCPクライアント(Claude Desktop)に対してエンドツーエンドで検証済み。.venvを介したローカル実行とDockerを介した完全コンテナ化の両方で、すべてのクエリがLangfuseでトレースされました。


セットアップと使用方法

要件: Docker Desktop、Python 3.13、gpt-5-minitext-embedding-3-smallがデプロイされたAzure AI Foundryリソース、および(オプションで)トレーシング用の無料のLangfuse Cloudアカウント。

  1. .env.example.envにコピーし、独自のAzure、Postgres、および(オプションで)Langfuseの資格情報を入力します。

  2. ベクターストアを起動します:docker compose up -d postgres

  3. 文書を取り込みます(一度だけ、または文書セットが変更されるたびに):

    pip install -r requirements-ingest.txt
    python embed_and_store.py
  4. CLIから直接アシスタントを実行します:python rag_chain.py

  5. または、MCPツールとして接続します:サーバーイメージをビルドし(docker compose build mcp-server)、MCPクライアントの設定(例:Claude Desktopのclaude_desktop_config.json)に追加します:

    "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、vector database、vector similarity search、Docker、Docker Compose、Langfuse、LLMOps、observability、Python、AI Engineer

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