Skip to main content
Glama
nepseli

rag-blob-mcp

by nepseli

RAG Blob MCP

Azure Blob Storage に保存されたドキュメントライブラリへの検索アクセスを RAG エージェントに提供する Model Context Protocol (MCP) サーバーと、ドキュメントのアップロードおよびチャットを行うための Streamlit アプリです。

  • MCP サーバー — Streamable HTTP 上の FastMCP。Azure Blob Storage へのすべてのアクセスを所有し、4 つのツールと 3 つのプロンプトテンプレートを公開します。起動のたびに Blob Storage から再構築されるインメモリベクトルインデックス(OpenAI 埋め込み)を保持します。

  • Streamlit アプリ — ライブラリタブ(ドキュメントのアップロード / 一覧表示 / 削除)とチャットタブ(サーバーの検索ツールを呼び出す LangGraph ReAct エージェントが質問に回答)を提供します。

クイックスタート

1. 前提条件

  • Python 3.11 以上(3.13 で開発)

  • Blob コンテナーを持つ Azure ストレージアカウント(お持ちでない場合は、下の Azure のセットアップ を参照)

  • OpenAI API キー

2. インストール

リポジトリのルートから:

python -m venv .venv
.venv\Scripts\activate          # Windows
pip install -r requirements.txt

3. 設定

.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. 実行

2 つのプロセス、2 つのターミナル。どちらもリポジトリのルートから:

# 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 のセットアップ

ストレージアカウントをまだお持ちでない場合:

  1. Azure Portal → リソースの作成 → ストレージアカウント。Standard パフォーマンス、LRS 冗長性で個人利用には十分です。

  2. 新しいアカウントで: データストレージ → コンテナー → + コンテナー。名前を付け(例: rag-documents)、アクセスレベルは Private にします。

  3. セキュリティとネットワーク → アクセスキー → キーの表示 で接続文字列をコピーします。

  4. それを .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 にあります:

変数

デフォルト

目的

OPENAI_API_KEY

— (必須)

チャットモデル + 埋め込み

OPENAI_MODEL

gpt-4.1

RAG エージェント用のチャットモデル

OPENAI_EMBEDDING_MODEL

text-embedding-3-small

ベクトルインデックス用の埋め込みモデル

AZURE_STORAGE_CONNECTION_STRING

— (必須)

Blob Storage アクセス

AZURE_STORAGE_CONTAINER_NAME

— (必須)

ドキュメントが置かれているコンテナー

MCP_SERVER_HOST

127.0.0.1

MCP サーバーがバインドするインターフェース

MCP_SERVER_PORT

8000

MCP サーバーがバインドするポート

MCP_SERVER_URL

http://127.0.0.1:8000/mcp

Streamlit アプリ / エージェントが接続する URL — ポートを変更した場合はこれも更新してください

使用方法

ライブラリタブ — PDF/DOCX/TXT/MD ファイルをアップロードします(200MB 制限、Streamlit による設定)。各アップロードはチャンク化され、埋め込まれ、検索インデックスに追加されます。ドキュメント一覧には indexed / failed / pending のステータスとチャンク数が表示されます。削除すると、Blob Storage とインデックスの両方からドキュメントが削除されます。

チャットタブ — 平易な英語で質問します。エージェントは検索ツールを呼び出すタイミングを決定し、関連するチャンクを取得し、ソースドキュメントをファイル名で引用して回答します。ライブラリが空または無関係な場合は、推測せずにその旨を伝えます。

テスト

pytest server/ -v

29 のテストが、テキスト抽出 / チャンク化、ベクトルインデックス、Azure Blob Storage ラッパー(モック)、および 4 つの MCP ツール + プロンプト(fastmcp.Client をプロセス内で使用し、フェイクを使用 — 実際の Azure / OpenAI 呼び出しなし)をカバーしています。Streamlit UI やライブのエージェント / サーバー配線の自動カバレッジはありません。実際の実行中サーバーに対する手動スモークテストについては、scripts/smoke_test_server.py を参照してください。

既知の制限事項

  • インメモリインデックス、永続化なし。 サーバーを再起動するたびに、コンテナー内のすべてのドキュメントを再ダウンロード、再抽出、再埋め込みします。小規模な個人ライブラリには問題ありませんが、ライブラリが大きくなるにつれて実際の OpenAI API 呼び出しと起動時間がかかります。

  • シングルユーザー、ローカルのみ。 認証なし、同時書き込みの安全性なし、どこにもデプロイされていません。

  • アプリを機能させるには、両方のプロセス(MCP サーバー、Streamlit アプリ)が実行されている必要があります — 詳細は プロジェクト全体のドキュメント を参照してください。

全体像(アーキテクチャ、設計上の決定、既知のバグ、次のステップ)については、PROJECT.md を参照してください(PROJECT.docx / PROJECT.pdf としても入手可能)。

Related MCP Connectors

Related MCP Servers