Brown Courses MCP Server
# 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
```bash
cd brown-courses-mcp
uv sync # or: pip install -e .
```
## Claude Desktop
Add to `~/Library/Application Support/Claude/claude_desktop_config.json`:
```json
{
"mcpServers": {
"brown-courses": {
"command": "uv",
"args": ["run", "--directory", "/path/to/brown-courses-mcp", "python", "server.py"]
}
}
}
```
## Claude Code
```bash
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_check` uses the structured `meetingTimes` JSON for conflict detection, not the human-readable `meets` string.
## Credits
Pattern inspired by [kenmham/DiningMCP](https://github.com/kenmham/DiningMCP).
TDQS
Scored across 5 tools
Each tool has a clearly distinct purpose: departments lists codes, search returns compact course lists, course_detail provides full details, batch_course_details handles multiple codes efficiently, and schedule_check identifies conflicts. There is no ambiguity about which tool to use for a given task.
All tool names use lowercase with underscores, which is consistent, but the grammatical pattern varies (nouns like 'departments' and 'course_detail', verbs like 'search', and a compound like 'schedule_check'). This is mostly consistent but not a uniform verb_noun pattern.
With 5 tools, the server is well-scoped for a course catalog domain. Each tool provides a necessary function without unnecessary overlap or bloat, fitting well within the ideal 3-15 range.
The server covers all core browsing needs: searching, retrieving full course details, batch retrieval, and schedule conflict checking. The inclusion of department listing and filtering parameters ensures users can navigate the catalog effectively, with no obvious gaps.