University Course Catalog MCP Server
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@University Course Catalog MCP ServerWhat are the prerequisites for CS101?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
University Course Catalog MCP Server
An MCP (Model Context Protocol) server that exposes a university course catalog as a set of tools, resources, and prompts. The intended consumer is an AI academic advisor — a language model that needs to answer questions about courses, prerequisites, and instructors without hallucinating data. The server gives that model a structured, queryable interface backed by a real database.
Architecture
graph LR
Client["MCP Client (LLM / Inspector)"]
subgraph Docker["Docker Container (port 8080)"]
subgraph Server["FastMCP"]
T["Tools\nsearch_courses\nget_prerequisites\nlookup_instructor\nget_prerequisite_graph"]
R["Resources\ncourse_descriptions\ndepartment_directory"]
P["Prompts\ncourse_comparison_template"]
end
ORM["SQLAlchemy ORM"]
DB["SQLite\ndata/catalog.db"]
end
Client -- "HTTP /mcp" --> Server
Client -- "HTTP /health" --> Server
T --> ORM
R --> ORM
ORM --> DBRelated MCP server: University Course Catalog MCP Server
Tech Stack
Component | Library / Tool |
Language | Python 3.12 |
MCP layer |
|
ORM | SQLAlchemy 2 |
Validation | Pydantic v2 |
Graph traversal | NetworkX |
Database | SQLite |
Container | Docker + Docker Compose |
Project Structure
.
├── README.md
├── Dockerfile
├── docker-compose.yml
├── .dockerignore
├── .env.example
├── .gitignore
├── requirements.txt
├── data/
│ ├── catalog.db # seeded SQLite file, committed to git
│ └── seed.py
├── src/
│ ├── __init__.py
│ ├── main.py # FastMCP instance, health route, entrypoint
│ ├── database.py # SQLAlchemy engine/session/Base
│ ├── models.py # Department, Instructor, Course, Prerequisite ORM models
│ ├── schemas.py # Pydantic input/output models for all 4 tools
│ ├── tools.py # tool implementations
│ ├── resources.py # course_descriptions / department_directory
│ └── prompts.py # course_comparison_template
└── scripts/
└── verify_server.py # repeatable smoke-test scriptSetup & Run
Docker (recommended)
docker compose up --buildThe server starts on port 8080. The MCP endpoint is at http://localhost:8080/mcp, health check at http://localhost:8080/health.
Local dev
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
# Seed the database (idempotent — safe to run multiple times)
python data/seed.py
# Start the server
python src/main.pyThe server reads DATABASE_URL from the environment. Copy .env.example to .env if you want to override the default (sqlite:///./data/catalog.db).
Database Schema
departments
Column | Type | Constraints |
id | INTEGER | PRIMARY KEY |
name | TEXT | NOT NULL |
code | TEXT | NOT NULL, UNIQUE |
instructors
Column | Type | Constraints |
id | INTEGER | PRIMARY KEY |
name | TEXT | NOT NULL |
TEXT | NOT NULL | |
office | TEXT | |
department_id | INTEGER | NOT NULL, FK → departments.id |
courses
Column | Type | Constraints |
id | INTEGER | PRIMARY KEY |
course_code | TEXT | NOT NULL, UNIQUE |
title | TEXT | NOT NULL |
description | TEXT | NOT NULL |
credits | INTEGER | NOT NULL |
instructor_id | INTEGER | NOT NULL, FK → instructors.id |
department_id | INTEGER | NOT NULL, FK → departments.id |
prerequisites
Column | Type | Constraints |
course_id | INTEGER | PRIMARY KEY, FK → courses.id |
prerequisite_id | INTEGER | PRIMARY KEY, FK → courses.id |
MCP Tools
Name | Purpose | Input | Output |
| Case-insensitive substring search over course title and description |
|
|
| Returns direct prerequisites (one level) for a course |
|
|
| Returns contact and department info for an instructor by name |
|
|
| Builds a full transitive prerequisite graph using NetworkX |
|
|
MCP Resources
Name | URI | Content |
|
| One line per course: |
|
| One line per department: |
Both resources are generated dynamically from the database on each read.
MCP Prompts
Name | Description |
| A comparison table template with literal |
Template text:
Create a table comparing the following two courses: {{course_code_1}} and {{course_code_2}}. Include columns for Title, Credits, Description, and Prerequisites.Example Queries
These are the kinds of natural-language questions a connected LLM could answer using the tools above:
"What courses do I need to take before I can enroll in Artificial Intelligence (CS401)?"
"Show me all the courses offered by the Mathematics department."
"How do I contact Dr. Sarah Chen, and what department is she in?"
"I want to take Database Systems — what's the full chain of prerequisites I need to complete first?"
"Compare Introduction to Programming and Calculus I — what are the differences in credits and content?"
Design Note: FastMCP over FastAPI
The server uses FastMCP from the MCP Python SDK directly, running with transport="streamable-http". I did not mount the MCP app inside a separate FastAPI application. Doing so (via FastAPI's .mount() applied to mcp.streamable_http_app()) is a known routing bug in the SDK where the MCP endpoint stops responding correctly after mounting. Using FastMCP.run() with its built-in Uvicorn runner avoids the issue entirely — the health endpoint is added with @mcp.custom_route("/health"), which registers it on the same Starlette app that FastMCP manages internally. One port, one process, no wrapper.
Verification
Run the smoke-test script against a locally running server:
python src/main.py &
python scripts/verify_server.pyThe script uses the MCP Python client library directly (no shelling out to the inspector) and prints real JSON results for all tools, both resources, and the prompt template.
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- Alicense-qualityDmaintenanceA Model Context Protocol server that provides LLMs with access to Georgia Tech's OSCAR course schedule system, enabling search for courses, subjects, and detailed course information.1MIT
- Flicense-qualityDmaintenanceMCP server for querying a university course catalog. Enables searching courses, checking prerequisites, and looking up instructors via natural language.
- Flicense-qualityCmaintenanceMCP server that exposes a university course catalog to LLMs, enabling course search, prerequisite lookup, instructor details, and department directory through natural language.
- Alicense-qualityCmaintenanceAn MCP server that connects AI assistants to university D2L Brightspace and Piazza, enabling query of courses, grades, assignments, deadlines, files, and Piazza posts.7MIT
Related MCP Connectors
MCP server for generating rough-draft project plans from natural-language prompts.
Educational MCP server with 17 math/stats tools, visualizations, and persistent workspace
Academic research MCP server for paper search, citation checks, graphs, and deep research.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/Rushikesh-5706/MCP-Server-for-a-University-Course-Catalog'
If you have feedback or need assistance with the MCP directory API, please join our Discord server