University Course Catalog MCP Server
Provides intelligent access to a university course catalog with full-text search, prerequisite tracking, instructor lookups, and course comparison prompts.
README
University Course Catalog MCP Server
A production-grade Model Context Protocol server that exposes a university course catalog through structured tools, resources, and prompt templates. Built with Python 3.12, FastAPI, SQLAlchemy 2.x, and the official MCP SDK.
Project Overview
This MCP server provides intelligent access to a university course catalog with the following capabilities:
- Full-text course search with optional department filtering
- Prerequisite dependency tracking with cycle prevention
- Instructor lookups with contact information and department associations
- Prerequisite graph analysis for understanding course dependencies
- Course catalog resource with complete course descriptions
- Department directory resource for department information
- Course comparison prompt template for structured LLM analysis
The server is designed to work seamlessly with Claude, ChatGPT, and other LLM clients through the MCP protocol.
Architecture
Design Principles
- Clean Separation of Concerns: Service layer abstraction decouples MCP tools from database operations
- Production Quality: Full logging, error handling, type hints, and docstrings throughout
- Scalability: SessionLocal factory pattern for thread-safe database access
- Maintainability: Centralized configuration, structured schemas, and comprehensive tests
Layer Structure
MCP Tools/Resources/Prompts (src/tools, src/resources, src/prompts)
↓
Pydantic Schemas (src/schemas) - Input/output validation
↓
Service Layer (src/services) - Business logic, database queries
↓
SQLAlchemy ORM (src/models) - Database mapping
↓
SQLite Database (data/catalog.db)
Data Flow
- MCP Client sends request with validated input
- Tool/Resource Handler validates input via Pydantic schema
- Service Layer queries database using SQLAlchemy 2.x with select()
- ORM marshals database results to Python objects
- Response returned as typed Pydantic model for JSON serialization
Folder Structure
university-mcp-server/
├── src/
│ ├── config.py # Environment configuration (Pydantic BaseSettings)
│ ├── database.py # SQLAlchemy engine and SessionLocal
│ ├── mcp_app.py # Shared FastMCP instance
│ ├── server.py # FastAPI application with MCP transport mounting
│ ├── models/ # SQLAlchemy ORM models
│ │ ├── course.py
│ │ ├── department.py
│ │ ├── instructor.py
│ │ └── prerequisite.py
│ ├── schemas/ # Pydantic validation schemas
│ │ └── course.py
│ ├── services/ # Business logic and database queries
│ │ ├── course_service.py
│ │ ├── department_service.py
│ │ ├── graph_service.py
│ │ └── instructor_service.py
│ ├── tools/ # MCP tools (registered via @mcp.tool)
│ │ ├── search_courses.py
│ │ ├── get_prerequisites.py
│ │ ├── lookup_instructor.py
│ │ └── get_prerequisite_graph.py
│ ├── resources/ # MCP resources (registered via @mcp.resource)
│ │ ├── course_descriptions.py
│ │ └── department_directory.py
│ └── prompts/ # MCP prompts (registered via @mcp.prompt)
│ └── course_comparison.py
├── data/
│ ├── seed.py # Database seeding script
│ └── catalog.db # SQLite database (created at runtime)
├── tests/ # Pytest test suite
│ ├── conftest.py # Fixtures and test configuration
│ ├── test_mcp_app.py
│ ├── test_endpoints.py
│ ├── test_tools.py
│ ├── test_resources.py
│ └── test_prompts.py
├── Dockerfile # Container image definition
├── docker-compose.yml # Multi-container orchestration
├── .env.example # Environment variable template
├── requirements.txt # Python dependencies
├── pytest.ini # Pytest configuration
└── README.md # This file
Installation
Prerequisites
- Python 3.12+
- pip or conda package manager
- Docker and Docker Compose (optional, for containerized deployment)
Local Setup
-
Clone the repository
cd university-mcp-server -
Create and activate virtual environment
# Windows python -m venv venv .\venv\Scripts\Activate.ps1 # macOS/Linux python3 -m venv venv source venv/bin/activate -
Install dependencies
pip install -r requirements.txt -
Initialize database
# Windows .\venv\Scripts\python.exe data/seed.py # macOS/Linux python data/seed.py -
Configure environment (optional)
# Copy template and customize if needed cp .env.example .env
Docker Setup
- Build and start with Docker Compose
docker-compose up --build
The container bootstraps the SQLite schema and seed data on startup, so a fresh checkout works without a prebuilt database file.
-
Verify server is running
curl http://localhost:8080/health # Response: {"status": "healthy"} -
Stop the service
docker-compose down
Environment Variables
Configure via .env file (see .env.example):
| Variable | Default | Description |
|---|---|---|
DATABASE_URL |
sqlite:///./data/catalog.db |
SQLAlchemy database connection string; supports sqlite, PostgreSQL, MySQL |
HOST |
0.0.0.0 |
Server binding address; use 127.0.0.1 for localhost-only |
PORT |
8080 |
Server port number (1-65535) |
Docker Environment
Docker Compose automatically sets all environment variables. Override in docker-compose.yml:
environment:
DATABASE_URL: sqlite:///./data/catalog.db
HOST: 0.0.0.0
PORT: 8080
Running Locally
Start the server
# Windows
.\venv\Scripts\python.exe -m src.server
# macOS/Linux
python -m src.server
Server will start on http://0.0.0.0:8080 with logging output.
Health check
curl http://localhost:8080/health
Expected response:
{"status": "healthy"}
Access MCP endpoints
- HTTP (Streamable):
http://localhost:8080/mcp - SSE (Server-Sent Events):
http://localhost:8080/sse - SSE message endpoint:
http://localhost:8080/sse/messages/
Docker Notes
- The image runs
create_db.pyanddata/seed.pyon startup before launching the API. - The build excludes the local virtual environment and cache directories with
.dockerignore. - The container exposes port
8080and uses the sameDATABASE_URL,HOST, andPORTsettings as local runs.
Testing
Run the full pytest suite:
# All tests
pytest
# Verbose output
pytest -v
# Specific test file
pytest tests/test_tools.py
# Specific test class
pytest tests/test_tools.py::TestSearchCoursesTool
# With coverage
pip install pytest-cov
pytest --cov=src --cov-report=html
Test Structure
- test_mcp_app.py: Startup smoke tests for FastAPI app composition and MCP registration (2 tests)
- test_endpoints.py: Health endpoint validation (3 tests)
- test_tools.py: MCP tool functionality (18 tests)
- search_courses: keyword search, filtering, no results, case insensitivity
- get_prerequisites: with/without prerequisites, error handling
- lookup_instructor: success, not found, whitespace handling
- get_prerequisite_graph: graph generation, structure validation
- test_resources.py: MCP resource generation (12 tests)
- course_descriptions: format, field inclusion, multiple courses
- department_directory: format, codes, alphabetical ordering
- test_prompts.py: Prompt template rendering (10 tests)
Coverage: 45 test cases covering app wiring, success paths, and failure paths.
Available MCP Tools
1. search_courses
Search the university course catalog by keyword with optional department filtering.
Input Schema
{
"query": "string (required, non-empty)",
"department_code": "string (optional, e.g., 'CS', 'AI')"
}
Output Schema
{
"root": [
{
"course_code": "CS101",
"title": "Introduction to Computer Science",
"credits": 3
}
]
}
Example Queries
- "Find all programming courses"
- "Search for data science courses in the DS department"
- "What computer science courses are available?"
2. get_prerequisites
Retrieve all direct prerequisite courses for a given course code.
Input Schema
{
"course_code": "string (required, e.g., 'CS201')"
}
Output Schema
{
"course_code": "CS201",
"prerequisites": [
{
"course_code": "CS101",
"title": "Introduction to Computer Science"
}
]
}
Example Queries
- "What are the prerequisites for CS201?"
- "Can I take AI101 without any prerequisites?"
- "What courses do I need to complete before taking CS301?"
3. lookup_instructor
Find instructor contact information and department assignment.
Input Schema
{
"instructor_name": "string (required, e.g., 'Dr. Alice Smith')"
}
Output Schema
{
"name": "Dr. Alice Smith",
"email": "alice@university.edu",
"department_name": "Computer Science"
}
Example Queries
- "How can I contact Dr. Alice Smith?"
- "What department is Dr. Bob Johnson in?"
- "Find the email for Dr. Carol White"
4. get_prerequisite_graph
Build a complete prerequisite dependency graph for a course, showing all direct and transitive prerequisites.
Input Schema
{
"course_code": "string (required, e.g., 'CS301')"
}
Output Schema
{
"nodes": [
{"id": "CS101"},
{"id": "CS201"},
{"id": "CS301"}
],
"edges": [
{"source": "CS101", "target": "CS201"},
{"source": "CS201", "target": "CS301"}
]
}
Example Queries
- "Show me the prerequisite chain for CS301"
- "What's the full dependency graph for AI301?"
- "Create a graph of all prerequisites needed for DS301"
Available MCP Resources
course_descriptions
A comprehensive text resource listing all university courses with complete descriptions.
URI: resource://course_descriptions
Format
[CODE] Title
Credits: N
Description: ...
------------------------------------
Example Response
[CS101] Introduction to Computer Science
Credits: 3
Description: Fundamentals of programming and computational thinking
------------------------------------
[CS201] Data Structures and Algorithms
Credits: 4
Description: Advanced programming concepts and algorithm design
------------------------------------
department_directory
A formatted text resource containing all university departments.
URI: resource://department_directory
Format
Name (Code)
Name (Code)
...
Example Response
Artificial Intelligence (AI)
Computer Science (CS)
Data Science (DS)
Prompt Template
course_comparison_template
A reusable prompt template for comparing two courses, useful for generating structured LLM analysis.
Parameters
course_code_1: First course code (e.g., "CS101")course_code_2: Second course code (e.g., "CS201")
Generated Prompt The template instructs the LLM to create a comparison table with:
- Course titles
- Credit hours
- Course descriptions
- Instructors
- Departments
- Prerequisites
- Recommendations for student types
Example Usage
Compare CS101 vs CS201 to understand which course would be better for a beginner programmer
Example Natural Language Queries
Course Discovery
- "What programming courses are available in the CS department?"
- "Find all courses about machine learning"
- "Show me the data science curriculum"
- "What courses can I take without prerequisites?"
Prerequisite Planning
- "What do I need to take CS301?"
- "Show me the full prerequisite chain for AI301"
- "Can I take DS201 if I've completed CS101?"
- "Map out all the required courses for the AI track"
Instructor Information
- "Who teaches CS201?"
- "How do I contact Dr. Alice Smith?"
- "What courses are taught by the Data Science department?"
- "Find all instructors in the Computer Science department"
Course Comparison
- "Compare CS101 and CS201 to decide which to take"
- "What's the difference between AI101 and DS101?"
- "Should I take the AI course or the DS course?"
Curriculum Planning
- "Create a 2-semester course plan for CS major"
- "What's the recommended order to take CS courses?"
- "Show me all prerequisites needed to take the advanced AI courses"
Technology Stack
Core Framework
- FastAPI 0.139.0 - Async web framework for Python
- Uvicorn - ASGI server for FastAPI
Database & ORM
- SQLAlchemy 2.x - Modern Python ORM with select() queries
- SQLite - Lightweight embedded database (default; easily swappable)
MCP & LLM Integration
- mcp 1.28.1 - Official Model Context Protocol SDK
- Pydantic v2 - Data validation and serialization
Utilities
- httpx - HTTP client for health checks
- NetworkX 3.x - Graph algorithms for prerequisite dependency analysis
Development & Testing
- pytest - Testing framework
- Docker & Docker Compose - Containerization and orchestration
Python Version
- Python 3.12 - Latest stable Python version with improved performance
Future Improvements
Phase 2: Enhanced Features
- [ ] Course enrollment management (add/drop functionality)
- [ ] Student transcript tracking
- [ ] GPA calculation and academic standing
- [ ] Course schedule/timetable queries
- [ ] Room and building location resources
- [ ] Instructor office hours and availability
Phase 3: Advanced Analytics
- [ ] Course recommendation engine based on student history
- [ ] Prerequisite conflict detection and resolution suggestions
- [ ] Workload analysis (credits per semester)
- [ ] Course difficulty ratings and student feedback
- [ ] Prerequisite weakness identification
Phase 4: Integration & Deployment
- [ ] PostgreSQL support for production environments
- [ ] Authentication and authorization (OAuth2)
- [ ] Rate limiting and API key management
- [ ] WebSocket support for real-time updates
- [ ] Kubernetes deployment manifests
- [ ] AWS/Azure cloud deployment guides
Phase 5: UX Improvements
- [ ] Multi-language support (Spanish, Chinese, etc.)
- [ ] Accessibility enhancements (screen reader optimization)
- [ ] Interactive prerequisite tree visualization
- [ ] Course planning calendar with drag-and-drop
- [ ] Mobile-friendly response formatting
License
This project is provided as-is for educational and demonstration purposes. Modify and distribute freely with attribution.
Questions or Issues?
For bugs, feature requests, or questions, refer to the project documentation or contact the development team.
Happy course planning! 🎓
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.
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.
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.
VeyraX MCP
Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.
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.
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.
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.
E2B
Using MCP to run code via e2b.