Brown Courses@Brown MCP Server
MCP server for Brown University's course catalog (cab.brown.edu). Search courses, get details, check schedule conflicts — all through Claude. No API keys or auth needed.
Tools
| Tool | What it does | |------|-------------| | search | Find courses by keyword, department, instructor, or semester. | | course_detail | Full details: description, prereqs, instructor, seats, Critical Review link. | | schedule_check | Check multiple courses for time conflicts. | | departments | List common Brown department codes. |
Typical flow: search to find courses → course_detail for the ones you're interested in → schedule_check to make sure they don't conflict.
Setup
cd brown-courses-mcp
uv sync # or: pip install -e .
Claude Desktop
Add to ~/Library/Application Support/Claude/claude_desktop_config.json:
{
"mcpServers": {
"brown-courses": {
"command": "uv",
"args": ["run", "--directory", "/path/to/brown-courses-mcp", "python", "server.py"]
}
}
}
Claude Code
claude mcp add brown-courses -- uv run --directory /path/to/brown-courses-mcp python server.py
API
Both endpoints are Brown-hosted, unauthenticated, and return JSON:
POST https://cab.brown.edu/api/?page=fose&route=search
POST https://cab.brown.edu/api/?page=fose&route=details
Search request body: ``json { "other": {"srcdb": "202520"}, "criteria": [ {"field": "keyword", "value": "linear algebra"}, {"field": "is_canc", "value": "N"} ] } ``
Details request body: ``json { "srcdb": "202520", "group": "code:MATH 1530" } ``
Term codes
| Code | Meaning | |------|---------| | YYYY10 | Fall | | YYYY15 | Winter | | YYYY20 | Spring | | YYYY00 | Summer | | 999999 | Any term |
Notes
- No authentication required for read-only course data (descriptions, times, instructors, enrollment counts).
- The details endpoint returns HTML fragments for some fields (instructor info, seats, suggested courses) — the server parses these into clean text.
- Term codes go back to at least 2016 in the CAB system.
schedule_checkuses the structuredmeetingTimesJSON for conflict detection, not the human-readablemeetsstring.
Credits
Pattern inspired by kenmham/DiningMCP.











