SOLVRO MCP - Knowledge Graph RAG System
Enables querying a Neo4j knowledge graph about Wroclaw University of Science and Technology using natural language. Converts user questions into Cypher queries and retrieves contextual information through an intelligent RAG pipeline with LLM-powered query routing.
README
SOLVRO MCP - Knowledge Graph RAG System

A production-ready Model Context Protocol (MCP) server implementing a Retrieval-Augmented Generation (RAG) system with Neo4j graph database backend. The system intelligently converts natural language queries into Cypher queries, retrieves relevant information from a knowledge graph, and provides contextual answers about Wroclaw University of Science and Technology.
Table of Contents
- Architecture Overview
- Features
- Prerequisites
- Installation
- Configuration
- Usage
- Project Structure
- Development
- API Reference
- Observability
- Contributing
Architecture Overview
The system consists of three main components:
- MCP Server - FastMCP-based server exposing knowledge graph tools
- MCP Client - CLI interface for querying the knowledge graph
- Data Pipeline - Multi-threaded ETL pipeline for loading documents into Neo4j
Data Flow
User Query → MCP Client → MCP Server → RAG System → Neo4j Graph DB
↓
Langfuse Observability
↓
LLM Processing → Response
Key Technologies
- FastMCP: Model Context Protocol server implementation
- LangChain: LLM orchestration and chaining
- LangGraph: State machine for RAG pipeline
- Neo4j: Graph database for knowledge storage
- Langfuse: Observability and tracing
- OpenAI/DeepSeek: LLM providers for query generation and answering
Features
Intelligent Query Routing
- Guardrails System: Automatically determines if queries are relevant to the knowledge base
- Fallback Mechanism: Returns graceful responses for out-of-scope queries
- Session Tracking: Full trace tracking across the entire query lifecycle
Advanced RAG Pipeline
- Multi-Stage Processing: Guardrails → Cypher Generation → Retrieval → Response
- State Machine Architecture: Built with LangGraph for predictable execution flow
- Error Handling: Robust error recovery with fallback strategies
- Caching: Schema caching for improved performance
Dual LLM Strategy
- Fast LLM (gpt-5-nano): Quick decision-making for guardrails
- Accurate LLM (gpt-5-mini): Precise Cypher query generation
Observability
- Langfuse Integration: Complete trace and session tracking
- Mermaid Visualization: Graph flow visualization for debugging
- Structured Logging: Comprehensive logging throughout the pipeline
Data Pipeline
- Multi-threaded Processing: Configurable thread pool for parallel document processing
- PDF Support: Extract and process PDF documents
- Dynamic Graph Schema: Configurable nodes and relationships via JSON
- Database Management: Built-in database clearing and initialization
Prerequisites
- Python 3.12 or higher
- Neo4j database instance (local or cloud)
- OpenAI API key or DeepSeek API key
- Langfuse account (for observability)
uvpackage manager (recommended) orpip
Installation
1. Clone the Repository
git clone <repository-url>
cd SOLVRO_MCP
2. Install Dependencies
Using uv (recommended):
uv sync
Using pip:
pip install -e .
3. Set Up Neo4j
Option A: Docker Compose
cd db
docker-compose up -d
Option B: Neo4j Desktop or Aura
Follow Neo4j's installation guide for your platform.
4. Configure Environment Variables
Create a .env file in the project root:
# LLM Provider (choose one)
OPENAI_API_KEY=your_openai_api_key
# OR
DEEPSEEK_API_KEY=your_deepseek_api_key
# CLARIN Polish LLM (optional, for Polish language support)
CLARIN_API_KEY=your_clarin_api_key
# Neo4j Configuration
NEO4J_URI=bolt://localhost:7687
NEO4J_USER=neo4j
NEO4J_PASSWORD=your_neo4j_password
# Langfuse Observability
LANGFUSE_SECRET_KEY=your_langfuse_secret_key
LANGFUSE_PUBLIC_KEY=your_langfuse_public_key
LANGFUSE_HOST=https://cloud.langfuse.com
Configuration
Graph Schema Configuration
Edit graph_config.json to define your knowledge graph structure:
{
"nodes": [
{
"name": "Student",
"properties": ["name", "id", "year"]
},
{
"name": "Course",
"properties": ["title", "code", "credits"]
}
],
"relationships": [
{
"type": "ENROLLED_IN",
"source": "Student",
"target": "Course",
"properties": ["semester", "grade"]
}
]
}
Usage
Running the MCP Server
Start the FastMCP server on port 8005:
just mcp-server
# OR
uv run server
The server will initialize the RAG system and expose the knowledge_graph_tool.
Querying via CLI Client
Query the knowledge graph using natural language:
just mcp-client "Czym jest nagroda dziekana?"
# OR
uv run kg "What is the dean's award?"
Example queries:
# Polish queries
uv run kg "Jakie są wymagania dla stypendium rektora?"
uv run kg "Kiedy są terminy egzaminów?"
# English queries
uv run kg "What are the scholarship requirements?"
uv run kg "When are the exam dates?"
Data Pipeline
Load Documents into Neo4j
just pipeline
# OR
uv run pipeline
Clear Database and Reload
just pipeline-clear
# OR
uv run pipeline --clear-db
Manual Pipeline Execution
uv run python src/scripts/data_pipeline/main.py \
data/ \
graph_config.json \
4 \
--clear-db
Parameters:
data/- Input directory containing PDF filesgraph_config.json- Graph schema configuration4- Number of parallel threads--clear-db- (Optional) Clear database before loading
Project Structure
SOLVRO_MCP/
├── src/
│ ├── mcp_server/ # MCP server implementation
│ │ ├── server.py # FastMCP server entry point
│ │ └── tools/
│ │ └── knowledge_graph/
│ │ ├── rag.py # RAG system core logic
│ │ ├── state.py # LangGraph state definitions
│ │ └── graph_visualizer.py # Mermaid visualization
│ │
│ ├── mcp_client/ # CLI client
│ │ └── client.py # Client implementation with Langfuse integration
│ │
│ └── scripts/
│ └── data_pipeline/ # ETL pipeline
│ ├── main.py # Pipeline orchestrator
│ ├── data_pipe.py # Data processing logic
│ ├── llm_pipe.py # LLM-based entity extraction
│ └── pdf_loader.py # PDF document loader
│
├── db/
│ └── docker-compose.yaml # Neo4j container configuration
│
├── data/ # Input documents directory
├── graph_config.json # Graph schema definition
├── pyproject.toml # Project dependencies and metadata
├── justfile # Task runner configuration
└── README.md # This file
Development
Code Quality
The project uses Ruff for linting and formatting:
just lint
# OR
uv run ruff format src
uv run ruff check src
Configuration
Ruff Settings (in pyproject.toml):
- Line length: 100 characters
- Target: Python 3.13
- Selected rules: E, F, I, N, W
Adding New Tools
To add a new MCP tool:
- Create a new function in
src/mcp_server/server.py - Decorate with
@mcp.tool - Add documentation and type hints
- Update the README
Example:
@mcp.tool
async def new_tool(param: str) -> str:
"""
Tool description.
Args:
param: Parameter description
Returns:
Result description
"""
# Implementation
return result
API Reference
MCP Server
knowledge_graph_tool
Query the knowledge graph with natural language.
Parameters:
user_input(str): User's question or querytrace_id(str, optional): Trace ID for observability
Returns:
str: JSON string containing retrieved context or "W bazie danych nie ma informacji"
Example:
result = await client.call_tool(
"knowledge_graph_tool",
{
"user_input": "What are the scholarship requirements?",
"trace_id": "unique-trace-id"
}
)
RAG System
RAG.ainvoke()
Async method to query the RAG system.
Parameters:
message(str): User's questionsession_id(str): Session identifier (default: "default")trace_id(str): Trace identifier (default: "default")callback_handler(CallbackHandler): Langfuse callback handler
Returns:
Dict[str, Any]: Dictionary containing:answer(str): JSON context or "W bazie danych nie ma informacji"metadata(dict):guardrail_decision(str): Routing decisioncypher_query(str): Generated Cypher querycontext(list): Retrieved data from Neo4j
Data Pipeline
DataPipe.load_data_from_directory()
Load and process PDF documents from a directory.
Parameters:
directory(str): Path to directory containing PDF files
Returns:
- None (processes documents in-place)
Observability
Langfuse Integration
The system provides comprehensive observability through Langfuse:
- Session Tracking: All queries within a session are grouped together
- Trace Hierarchy: Multi-level traces showing:
- Guardrails decision
- Cypher generation
- Neo4j retrieval
- Final answer generation
- Metadata Tagging: Traces tagged with component identifiers
- Performance Metrics: Latency and token usage tracking
Viewing Traces
- Log in to your Langfuse dashboard
- Navigate to "Sessions" to see grouped queries
- Click on individual traces for detailed execution flow
- Use filters to search by tags:
mcp_client,knowledge_graph,guardrails, etc.
Graph Visualization
The RAG system includes Mermaid graph visualization:
print(rag.visualizer.draw_mermaid())
This outputs a Mermaid diagram showing the state machine flow.
Error Handling
Common Issues
1. Connection Refused (Neo4j)
Error: Could not connect to Neo4j at bolt://localhost:7687
Solution: Ensure Neo4j is running:
cd db && docker-compose up -d
2. API Key Issues
Error: Missing required environment variables
Solution: Check your .env file contains all required keys.
3. Import Errors
ImportError: cannot import name 'langfuse_context'
Solution: This import is not available in standard Langfuse. Use session tracking through function parameters.
Performance Tuning
Thread Configuration
Adjust parallel processing threads in the pipeline:
uv run python src/scripts/data_pipeline/main.py data/ graph_config.json 8
Recommended thread counts:
- CPU-bound: Number of CPU cores
- I/O-bound: 2-4x CPU cores
Neo4j Optimization
- Indexing: Create indexes on frequently queried properties
- LIMIT Clauses: Pipeline automatically adds LIMIT to queries
- Connection Pooling: FastMCP handles connection management
LLM Configuration
Adjust model parameters in rag.py:
self.fast_llm = BaseChatOpenAI(
model="gpt-5-nano",
temperature=0.1, # Lower = more deterministic
)
AI Coding Guidelines
For AI coding assistants and developers, see .github/agents.md for detailed coding guidelines and patterns.
- Fork the repository
- Create a feature branch:
git checkout -b feature/new-feature - Follow the coding guidelines in
.github/agents.md - Make changes and ensure tests pass
- Run linting:
just lint - Commit changes:
git commit -m "feat: Add new feature" - Push to branch:
git push origin feature/new-feature - Open a Pull Request // ...existing code...
Contributing
- Fork the repository
- Create a feature branch:
git checkout -b feature/new-feature - Make changes and ensure tests pass
- Run linting:
just lint - Commit changes:
git commit -m "Add new feature" - Push to branch:
git push origin feature/new-feature - Open a Pull Request
License
[Add your license here]
Acknowledgments
- Built for Wroclaw University of Science and Technology
- Powered by FastMCP, LangChain, and Neo4j
- Observability by Langfuse
Support
For issues and questions:
- Open an issue on GitHub
- Contact the development team
- Check the documentation at [link]
Recommended Servers
playwright-mcp
A Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots without requiring vision models or screenshots.
Magic Component Platform (MCP)
An AI-powered tool that generates modern UI components from natural language descriptions, integrating with popular IDEs to streamline UI development workflow.
Audiense Insights MCP Server
Enables interaction with Audiense Insights accounts via the Model Context Protocol, facilitating the extraction and analysis of marketing insights and audience data including demographics, behavior, and influencer engagement.
VeyraX MCP
Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.
graphlit-mcp-server
The Model Context Protocol (MCP) Server enables integration between MCP clients and the Graphlit service. Ingest anything from Slack to Gmail to podcast feeds, in addition to web crawling, into a Graphlit project - and then retrieve relevant contents from the MCP client.
Kagi MCP Server
An MCP server that integrates Kagi search capabilities with Claude AI, enabling Claude to perform real-time web searches when answering questions that require up-to-date information.
E2B
Using MCP to run code via e2b.
Neon Database
MCP server for interacting with Neon Management API and databases
Exa Search
A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way.
Qdrant Server
This repository is an example of how to create a MCP server for Qdrant, a vector search engine.