loading…
Search for a command to run...
loading…
Enables hybrid search over policies using Reciprocal Rank Fusion and provides grounded, context-aware answers via a LangGraph agent with COSTAR prompting.
Enables hybrid search over policies using Reciprocal Rank Fusion and provides grounded, context-aware answers via a LangGraph agent with COSTAR prompting.
Production-ready RAG system combining LangGraph agent with Model Context Protocol (MCP) integration. Features hybrid search using Reciprocal Rank Fusion (RRF) via MongoDB vector and full-text searches, grounded responses using COSTAR prompting, and automated RAGAS-based evaluation for building reliable, context-aware AI agents.
The MCP RAG Agent is a sophisticated question-answering system that:

The system architecture diagram illustrates two main workflows:
Document Indexing Flow (Setup Phase): Documents are processed, embedded using OpenAI, and stored in MongoDB Atlas Vector Search with appropriate indexing for efficient retrieval.
Question-Answering Flow (Runtime): User queries trigger the LangGraph ReAct agent, which uses MCP tools to search relevant documents via semantic search, then formulates grounded responses based on retrieved context.
Additionally, the system includes a third workflow not shown in the diagram:
mcp-rag-agent/
├── data/
│ ├── ingested_documents/ # Source documents (policies)
│ │ └── policies/
│ │ ├── 1 - Remote Working.txt
│ │ ├── 2 - Expenses.txt
│ │ ├── 3 - Annual Leave.txt
│ │ ├── 4 - IT Security.txt
│ │ └── 5 - Sustainability.txt
│ └── evaluation_documents/ # Test cases for evaluation
│ └── expected_behaviour.xlsx
├── evaluation/ # Automated testing and metrics
│ ├── main.py # Main evaluation orchestration script
│ ├── answer_generator.py # Generates answers using the agent
│ ├── metrics_evaluator.py # Evaluates answers using RAGAS metrics
│ ├── metrics.py # RAGAS metrics wrapper and definitions
│ ├── results/ # Evaluation output (CSV files)
│ └── README.md # Evaluation module documentation
├── src/mcp_rag_agent/
│ ├── agent/ # LangChain agent implementation
│ │ ├── create_agent.py # Agent creation and configuration
│ │ ├── prompts/ # COSTAR-based system prompts
│ │ │ ├── __init__.py # Prompts module exports
│ │ │ └── system_prompt.py # System prompt definitions
│ │ ├── utils/ # Agent utility functions
│ │ │ ├── mcp_rag_agent_creator.py # MCP-enabled agent factory
│ │ │ └── rag_agent_creator.py # Base RAG agent factory
│ │ └── README.md # Agent module documentation
│ ├── embeddings/ # Document processing and indexing
│ │ ├── embedding_generator.py # OpenAI embeddings generation
│ │ ├── index_documents.py # Document indexing pipeline
│ │ ├── semantic_search.py # Vector similarity search
│ │ ├── hybrid_search.py # Hybrid search combining vector + text
│ │ └── README.md # Embeddings module documentation
│ ├── mcp_server/ # MCP server implementation
│ │ ├── server.py # FastMCP server with tools
│ │ ├── tools.py # MCP tool implementations
│ │ └── README.md # MCP server documentation
│ ├── mongodb/ # Database client
│ │ ├── client.py # MongoDB wrapper with vector search
│ │ └── README.md # MongoDB module documentation
│ └── core/ # Configuration and utilities
│ ├── config.py # Environment-based configuration
│ └── log_setup.py # Logging configuration
├── tests/ # Tests
│ └── unit_tests # Unit tests
├── .env.example # Example environment configuration
├── .gitignore # Git ignore patterns
├── requirements.txt # Production dependencies
├── requirements_dev.txt # Development dependencies
├── setup.py # Package installation configuration
├── start.cmd # Windows startup script
└── README.md # This file
git clone <repository-url>
cd mcp-rag-agent
start file:# Windows:
start.cmd
# Linux/macOS:
chmod +x start.sh
./start.sh
This script will automatically:
cp .env.example .env
# Edit .env with your settings
python -m mcp_rag_agent.embeddings.index_documents
This will:
data/ingested_documents/mcp dev src/mcp_rag_agent/mcp_server/server.py
This opens a UI to test the search_documents tool and other resources.
python -m mcp_rag_agent.agent.create_agent
This runs a demo query showing the agent in action.
python evaluation/main.py
Runs automated evaluation using RAGAS metrics.
import asyncio
from mcp_rag_agent.agent.create_agent import create_mcp_rag_agent
from mcp_rag_agent.agent.prompts import system_prompt
from mcp_rag_agent.core.config import config
async def main():
# Create agent
agent = await create_mcp_rag_agent(
system_prompt=system_prompt,
config=config
)
# Query the agent
result = await agent.ainvoke({
"messages": [{
"role": "user",
"content": "What is the remote working policy?"
}]
})
# Get the answer
answer = result["messages"][-1].content
print(answer)
asyncio.run(main())
import asyncio
from mcp_rag_agent.mongodb.client import MongoDBClient
from mcp_rag_agent.embeddings.embedding_generator import EmbeddingGenerator
from mcp_rag_agent.embeddings.semantic_search import SemanticSearch
from mcp_rag_agent.core.config import config
async def main():
# Setup
mongo_client = MongoDBClient(config.db_url, config.db_name)
mongo_client.connect()
embedder = EmbeddingGenerator(
api_key=config.model_api_key,
model=config.embedding_model
)
search = SemanticSearch(mongo_client, embedder)
# Search
results = await search.search(
query="annual leave entitlement",
limit=3
)
for doc in results:
print(f"File: {doc['file_name']}")
print(f"Score: {doc['score']:.3f}")
print(f"Content: {doc['content'][:200]}...\n")
mongo_client.disconnect()
asyncio.run(main())
import asyncio
from mcp_rag_agent.mongodb.client import MongoDBClient
from mcp_rag_agent.embeddings.embedding_generator import EmbeddingGenerator
from mcp_rag_agent.embeddings.hybrid_search import HybridSearch
from mcp_rag_agent.core.config import config
async def main():
# Setup
mongo_client = MongoDBClient(config.db_url, config.db_name)
mongo_client.connect()
embedder = EmbeddingGenerator(
api_key=config.model_api_key,
model=config.embedding_model
)
hybrid = HybridSearch(
mongo_client=mongo_client,
embedding_generator=embedder,
default_collection=config.db_vector_collection
)
# Perform hybrid search (combines semantic + keyword matching)
results = await hybrid.search(
query="What are the sustainability initiatives?",
limit=5,
semantic_weight=0.7 # 70% semantic, 30% keyword (default)
)
for doc in results:
print(f"RRF Score: {doc['rrf_score']:.4f}")
print(f"Vector Rank: {doc['vector_rank']}, Text Rank: {doc['text_rank']}")
print(f"Content: {doc['content'][:200]}...\n")
mongo_client.disconnect()
asyncio.run(main())
import asyncio
from mcp_rag_agent.embeddings.index_documents import index_documents
from mcp_rag_agent.core.config import config
async def main():
await index_documents(
directory_path="data/ingested_documents",
config=config
)
asyncio.run(main())
Each module has detailed documentation:
Configuration is managed through two layers:
.env): Most settings are configured via environment variables, although only the external dependencies are included in the .env.sample file.src/mcp_rag_agent/core/config.py): Some advanced settings are configured directly in the Config class, such as text generation parameters (temperature,...)Note: To modify these settings, edit src/mcp_rag_agent/core/config.py directly. The Config class loads environment variables and provides default values for all configuration parameters.
pytest tests/
New MCP Tool:
@mcp.tool() decorated function in server.pymcp devNew Document Type:
index_documents.py to handle new formatNew Metric:
evaluation/metrics.pyThe project includes comprehensive evaluation tools using RAGAS:
python evaluation/evaluator.py
Metrics computed:
Results are saved to evaluation/results/ with timestamps.
MongoDB connection fails:
.envMCP server won't start:
No search results:
index_documents.py to populate databaseAgent doesn't call tools:
Evaluation errors:
expected_behaviour.xlsx existsinsert_documents() for bulk indexing.env file to version controlMIT
Run in your terminal:
claude mcp add mcp-rag-agent -- npx Security
Low riskAutomated heuristic from public metadata — not a security guarantee.