Skip to main content
Glama
SantoshpHiremath

rag-tool-agent

RAG Tool Agent — MCP サーバー

rag-tool-agent-demo プロジェクトの背後にある 2 つのツール(FordA データセットのメモを対象とした検索結果に基づく Q&A と、安全な算術計算機)を、本格的な Model Context Protocol サーバーとして公開します。これにより、MCP 互換の任意のクライアント(Claude Desktop、MCP 対応エージェントハーネス、カスタムホストなど)は、そのプロジェクト独自の CLI や rag-tool-api-docker 内の Flask HTTP ラッパー経由だけでなく、これらのツールを直接呼び出せます。

明確に特定された具体的なギャップを埋めるために構築されました。現在の AI エンジニア/エージェント型アプリケーションの求人情報のいくつかは、MCP(および関連するエージェント間/エージェントと UI 間のプロトコル)に関する実践的な経験を明示的に求めています。これは小規模で、実際に動作するテスト済みの実装であり、裏付けのないプロトコル経験の主張ではありません。

このような構成にした理由

元のエージェントは内部で独自のルーティングを行います。受信した各質問に対して「calculator」か「retrieval」か「direct answer」かを判断する、手作りの if/else です。MCP はこれを逆転させます。ルーティングを行うのは クライアント(LLM/エージェントホスト)であり、各ツールの名前、説明、JSON スキーマのパラメータを読み取って、どれを呼び出すかを決定します。したがって、このサーバーは元のルーティングロジックを再実装するのではなく、基盤となる 2 つの機能をスタンドアロンで独立して呼び出し可能な MCP ツールとして公開し、任意の MCP クライアントがそれらへのルーティングを自身で行えるようにします。これこそがこのプロトコルの本質です。ツールは 1 つのエージェントのディスパッチロジックに組み込まれるのではなく、ホスト非依存になるのです。

  • search_notes(query: str) -> str — FordA データセットに関する小さなインライン化されたメモコーパスに対する検索型ルックアップです。元のエージェントと同じ [Grounded in N retrieved chunk(s) from ...] 出典サフィックス付きで返されるため、クライアントは根拠のある回答と根拠のない回答を区別できます。元のプロジェクトの FAISS/埋め込みインデックスを再構築するのではなく、小さなキーワード重複ランカーを使用します。このプロジェクトの目的は MCP 公開レイヤーであり、その作業を複製することではありません。

  • calculate(expression: str) -> str — 算術ツールです。ast ベースの安全な評価器により、+ - * / () と数値リテラルに制限されています(任意の入力に対する生の eval() ではありません)。非算術入力と、__import__('os').system(...) のようなインジェクション試行の両方を拒否することが検証されています。

  • 公式の mcp Python SDK(FastMCP)で構築されています。これは Anthropic が MCP サーバー構築用に公開している SDK と同じものです。

Related MCP server: rag-mcp

実行方法

pip install -r requirements.txt
python server.py

stdio 経由で動作します。これは、Claude Desktop のような MCP クライアントがサーバーをサブプロセスとして起動して通信するために使用する、標準的なローカルトランスポートです。Claude Desktop でこのサーバーを使用するには、その MCP サーバー設定に以下を追加します:

{
  "mcpServers": {
    "rag-tool-agent": {
      "command": "python",
      "args": ["/absolute/path/to/server.py"]
    }
  }
}

テストの実行

pytest tests/ -v

11 件のテストがすべて成功しています。ツール関数を直接呼び出すため、ツールロジック自体のユニットレベルカバレッジには MCP トランスポートは不要です:根拠付き検索の回答、グラウンディング件数の契約、算術の正確性(元のエージェント自身が文書化した例と一致する除算の例を含む)、非算術入力とインジェクション入力の拒否、ゼロ除算の処理、説明付きツールの自己登録。

単なる関数としてではなく、実際の MCP サーバーとして検証済み

ユニットテストに加えて、実際の mcp クライアント SDK(ClientSession + stdio_client)を使用したエンドツーエンドの検証も行いました。server.py を実際のサブプロセスとして起動し、MCP の initialize ハンドシェイクを完了し、list_tools() を呼び出し、実際のプロトコル上で両方のツールを呼び出しています:

TOOLS: ['search_notes', 'calculate']
calculate -> 1320 / (3601 + 1320) = 0.2682381629750051
search_notes -> The FordA dataset is a univariate time-series
  classification dataset... [Grounded in 3 retrieved chunk(s) from
  forda_dataset_notes.md]
calculate(injection) -> Error: could not evaluate "__import__('os')" ...

これにより、このサーバーが実際の MCP(ハンドシェイク、ツール検出、ツール呼び出し)を話せること、そして基盤となる Python 関数が単独で動作するだけではないことが確認されます。

他の 2 つのプロジェクトとの関係

  • rag-tool-agent-demo — 元の CLI エージェントです。LangChain、FAISS、Ollama、LCEL 検索チェーン、計算ツール、LLM 駆動のルーティングを備えています。

  • rag-tool-api-docker — そのエージェントを Flask HTTP API としてラップし、コンテナ化したものです(Docker、マルチステージビルド、非 root ユーザー、ヘルスチェック)。稼働中のコンテナに対して実際の HTTP リクエストを送信して検証済みです。

  • 本プロジェクト — 同じ基盤機能(検索、計算)を HTTP ではなく MCP 経由で公開します。これにより、REST クライアントだけでなく、任意の MCP ホストから呼び出せるようになります。

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    C
    maintenance
    Enables document search, read-only SQL querying, arithmetic calculation, and corpus introspection through MCP tools, allowing Claude to dynamically discover and chain these tools together to answer multi-step questions.
    -
  • F
    license
    Not graded
    quality
    C
    maintenance
    Enables querying local documents via retrieval-augmented generation, along with current UTC datetime and safe arithmetic evaluation through MCP tools over HTTP.
    -
  • A
    license
    A
    quality
    C
    maintenance
    Provides a document store, web search, and safe calculator as MCP tools, enabling both offline and LLM-driven clients to discover and call them over the Model Context Protocol.
    6
    MIT