cmucourses-connector
Remote MCP connector providing live, structured access to CMU Courses public data including courses, prerequisites, schedules, instructors, gen-eds, and final-exam times to help students plan schedules.
README
CMU Courses — Claude Connector
A remote MCP connector that gives Claude live, structured access to CMU Courses public data so it can help students plan schedules with accurate course info: courses, units, descriptions, prerequisites/corequisites/crosslists, requisite trees, offered schedules (times, instructors, locations), instructor teaching history, gen-eds, and final-exam times.
- Read-only wrapper of the existing CMU Courses public API — it does not modify or run any part of the CMU Courses codebase.
- Stateless, authless, deployed to Cloudflare Workers (Streamable HTTP, MCP).
- Backend:
https://course.apis.scottylabs.org(the live ScottyLabs course backend).
FCE (course evaluations / workload / ratings) is not included in this version. That data is sign-in-gated behind Clerk, and a remote connector can't reach a user's browser session. See
src/auth/authProvider.tsfor the deferred design.
Tools
| Tool | What it does |
|---|---|
search_courses |
Keyword + filter search (department, level, units, semester); paginated 10/page |
get_course |
Full details for one course by ID (optionally with schedules) |
get_courses |
Batch details for several courses |
get_requisites |
Prereqs (with AND/OR relation groups) + postreqs for a course |
get_course_schedules |
Offered lectures/sections for course(s): days, times, instructors, locations |
get_instructor_schedules |
Courses/semesters an instructor teaches |
find_courses |
Resolve a partial name/ID to matching courses (lightweight lookup) |
find_instructors |
Resolve a partial instructor name |
get_geneds |
Gen-ed-eligible courses for a school (SCS/CIT/MCS/Dietrich) |
get_finals |
Final-exam day/time/location (bundled per-semester snapshot) |
list_departments |
Department name ↔ short name ↔ number-prefix map |
Develop
npm install
npm run typecheck # tsc --noEmit
npm test # unit tests (mocked backend) — 38 tests
npm run test:integration # live contract tests against the real backend
npm run dev # wrangler dev on http://127.0.0.1:8787/mcp
Drive it locally with the MCP Inspector:
npm run inspector # then connect to http://127.0.0.1:8787/mcp (transport: Streamable HTTP)
Or with Claude Code:
claude mcp add --transport http cmucourses http://127.0.0.1:8787/mcp
Stress test (mixed tools, live backend):
node scripts/stress.mjs http://127.0.0.1:8787/mcp 50 200
Deploy (Cloudflare Workers)
npx wrangler login # one-time, uses your Cloudflare account
npx wrangler deploy # -> https://cmucourses-connector.<your-subdomain>.workers.dev
The backend URL is set in wrangler.jsonc (vars.CMU_COURSES_BACKEND_URL) and can be overridden per environment. An optional KV cache for the large /courses/all and /instructors lists is documented (commented) in wrangler.jsonc; the connector also caches these in-isolate by default, so KV is optional.
Register in Claude
Live deployment: https://cmucourses-connector.samethanmathew.workers.dev/mcp
- Settings → Connectors → Add custom connector.
- Paste the URL above (note the
/mcppath). - No login is required (public data). The tools appear immediately.
Maintaining the finals snapshot
src/reference/finals.snapshot.json is a per-semester copy of the CMU Courses finals data (currently Fall 2025). When the semester changes, replace it from cmucourses/apps/frontend/src/components/finals/finals.json and update SEMESTER_LABEL in src/tools/finals.ts.
Layout
src/
index.ts Worker entry + createServer()
mcp/ Minimal MCP server (JSON-RPC) + Streamable-HTTP transport
backend/ CMU Courses API client (encoding, normalization, retries, cache)
tools/ One module per tool group
reference/ Departments, gened schools, day map, finals snapshot
auth/ Deferred FCE seam (not wired in v1)
test/ Unit + live integration/contract tests
scripts/stress.mjs Concurrency load test
docs/EVALS.md Golden-answer eval prompts
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.