Skip to main content
Glama
Hwzw

Brown Courses MCP Server

by Hwzw
README.md
# 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

A4.5/5.0

Scored across 5 tools

Disambiguation5/5

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.

Naming Consistency4/5

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.

Tool Count5/5

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.

Completeness5/5

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.

Maintenance

ActivityInactive
ResponsivenessNo issues