Brown Courses MCP Server
Click on "Deploy 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., "@Brown Courses MCP ServerSearch for linear algebra courses this fall"
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.
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 |
| Find courses by keyword, department, instructor, or semester. |
| Full details: description, prereqs, instructor, seats, Critical Review link. |
| Check multiple courses for time conflicts. |
| 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.
Related MCP server: Canvas Assignment Assistant MCP Server
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.pyAPI
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=detailsSearch request body:
{
"other": {"srcdb": "202520"},
"criteria": [
{"field": "keyword", "value": "linear algebra"},
{"field": "is_canc", "value": "N"}
]
}Details request body:
{
"srcdb": "202520",
"group": "code:MATH 1530"
}Term codes
Code | Meaning |
| Fall |
| Winter |
| Spring |
| Summer |
| 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.
Available Tools
5 toolsbatch_course_detailsA
Get details for multiple courses at once (parallel fetch). Much faster than calling course_detail repeatedly.
Args: codes: List of course codes, e.g. ["MATH 1530", "CSCI 0200", "ECON 1110"]. semester: "fall", "spring", "winter", "summer", or "any". Empty = current term. year: 4-digit year, e.g. "2026". Empty = current year.
| Name | Required | Description | Default |
|---|---|---|---|
| year | No | ||
| codes | Yes | ||
| semester | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Without annotations, the description carries the burden. It discloses that the tool performs parallel fetches and is faster. It also clarifies default behavior for empty semester and year parameters. It does not mention error handling or limits, but those are less critical given the output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is succinct and well-structured: an intro sentence, a comparative sentence, and a clear Args block. Every sentence adds value without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the tool's purpose, usage context, parameters, and performance benefit. The output schema handles return format. It could mention potential limitations like maximum codes, but for a batch fetch tool this is adequate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has no descriptions, but the description's Args section adds critical meaning: it provides example codes, enumerates valid semester values, and explains that empty strings default to the current term/year. This fully compensates for the schema's lack of descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: 'Get details for multiple courses at once (parallel fetch).' It uses a specific verb and resource, and distinguishes itself from sibling course_detail by emphasizing batch operation and speed.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly mentions the alternative 'calling course_detail repeatedly' and positions this tool as faster for batch operations. However, it does not explicitly state when not to use it (e.g., for single course requests), though it is implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
course_detailA
Get full details for a specific course: description, prerequisites, instructor info, meeting times, seats, Critical Review link, and more.
Args: code: Course code, e.g. "MATH 0520", "CSCI 0200", "BIOL 0500". semester: "fall", "spring", "winter", "summer", or "any". Empty = current term. year: 4-digit year, e.g. "2026". Empty = current year.
| Name | Required | Description | Default |
|---|---|---|---|
| code | Yes | ||
| year | No | ||
| semester | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It describes the return content but does not disclose potential failure modes, side effects, or behavior for invalid inputs. The 'Get' verb implies read-only, and parameter defaults are explained, but edge cases are not addressed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description starts with a concise summary, then a compact Args block that provides exactly the needed parameter guidance. No superfluous information, well-structured and front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given that an output schema exists, the description covers purpose and parameters well. It might benefit from noting fallback to current term/year or what happens if the course is not found, but overall it is adequate for the tool's simplicity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has no descriptions, and the description thoroughly explains each parameter with examples, allowed values for semester, and default behavior for empty year/semester. This fully compensates for the 0% schema description coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: retrieving full details for a specific course, listing the types of information included. This distinguishes it from siblings like 'search' and 'batch_course_details'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for single-course detail lookups but does not explicitly contrast with batch_course_details or search. It provides clear context for when to use it but lacks explicit exclusions or alternative tool references.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
departmentsA
List common Brown department codes for use with the search tool. Not exhaustive — use keyword search if you don't see your department.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It discloses that the list is not exhaustive, setting expectations about coverage, and provides context on its use. While it does not detail output format, the presence of an output schema covers that. The added limitation note goes beyond a bare statement.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loaded with the main purpose and followed by a necessary limitation. There is zero wasted wording; each sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple parameterless tool with an output schema, the description fully covers what the agent needs to know: what it lists, that it is for use with search, and that it is non-exhaustive with a fallback. The presence of the output schema removes the need to describe return values, so the description is complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the baseline is 4. The description does not need to explain parameters, but it does add context about how the output (department codes) integrates with the search tool, which is meaningful for the tool's use.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it lists common Brown department codes and explicitly ties this to use with the search tool. This distinguishes it from sibling tools like search or course_detail, making the purpose unambiguous and specific.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit guidance: use it to obtain department codes for the search tool, and if the department is not listed, use keyword search instead. This clearly states when to use this tool and provides an alternative, satisfying the when/when-not requirement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
schedule_checkA
Check meeting times for multiple courses to spot conflicts.
Args: codes: List of course codes, e.g. ["MATH 1530", "CSCI 0200", "BIOL 0500"]. semester: "fall", "spring", "winter", "summer", or "any". Empty = current term. year: 4-digit year. Empty = current year.
| Name | Required | Description | Default |
|---|---|---|---|
| year | No | ||
| codes | Yes | ||
| semester | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description must carry the behavioral disclosure burden. It conveys a non-mutating 'check' action, implying a read-only operation, but does not mention any potential side effects, authentication requirements, rate limits, or behavior on invalid inputs. This is adequate but not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and well-structured: a single-sentence purpose followed by a clearly formatted Args list. Every sentence provides necessary information without fluff or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool of moderate complexity (multiple courses, semester/year parameters), the description, combined with the presence of an output schema, covers the essential aspects. There is no obvious missing information that would prevent an agent from using the tool effectively.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has no parameter descriptions (0% coverage), but the description fully compensates by explaining each parameter: 'codes' with examples, 'semester' with allowed values and default behavior, and 'year' with format and default. This adds significant meaning beyond the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific verb and resource: 'Check meeting times for multiple courses to spot conflicts.' This distinguishes it from siblings like course_detail, which focuses on single course details, and batch_course_details, which likely returns course details without conflict analysis.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description establishes clear context: use when you need to analyze meeting times across multiple courses to identify conflicts. However, it does not explicitly mention when not to use it or name alternative tools, so it stops short of a full 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
searchA
Search Brown's course catalog (Courses@Brown / CAB).
Returns a compact list of matching courses with codes, titles, instructors, meeting times, and seat availability.
Args: keyword: Free-text search, e.g. "linear algebra", "MATH 1530", "machine learning". department: Department code, e.g. "MATH", "CSCI", "BIOL", "ENGN". instructor: Instructor last name, e.g. "smith". semester: "fall", "spring", "winter", "summer", or "any". Empty = current term. year: 4-digit year, e.g. "2026". Empty = current year.
| Name | Required | Description | Default |
|---|---|---|---|
| year | No | ||
| keyword | No | ||
| semester | No | ||
| department | No | ||
| instructor | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden for behavioral disclosure. It adds useful context about defaults (e.g., 'Empty = current term' and 'Empty = current year') and specifies the shape of the output (list of codes, titles, instructors, meeting times, seat availability). However, it does not mention limits, pagination, or how filters combine, which would improve transparency further.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and well-structured: a two-sentence purpose statement followed by a bullet-like 'Args:' list. Every sentence provides necessary information without waste. It is front-loaded with the tool's purpose and output, making it easy to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has 5 optional parameters and an output schema, the description is largely complete: all parameters are documented with examples and defaults, and the return type is summarized. The main gap is that the description does not explain how multiple filters interact, sorting, or result limits, but the presence of an output schema and the straightforward search nature keep it sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema only provides titles and defaults, with 0% description coverage. The tool description compensates fully by explaining each parameter with examples (e.g., 'keyword: Free-text search, e.g. "linear algebra", "MATH 1530"') and clarifying default behavior for semester and year. This adds significant meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Search Brown's course catalog (Courses@Brown / CAB)' and defines the output as 'a compact list of matching courses with codes, titles, instructors, meeting times, and seat availability.' This distinguishes it from siblings like course_detail (which would presumably provide full details) by emphasizing the compact list format.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides guidance on what each parameter does (e.g., 'keyword: Free-text search... department: Department code...') and implies use for searching courses. However, it does not explicitly state when to use this tool versus its siblings (departments, course_detail, batch_course_details, schedule_check) or exclude any scenarios, so usage guidance is primarily implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
5 tool updates
v0.1.0- First observed
batch_course_details - First observed
course_detail - First observed
departments - First observed
schedule_check - First observed
search
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.
Maintenance
Related MCP Connectors
Unofficial NTNU course data: search, timetables, grades, course info, and exam logistics.
Read-only access to Epivo's live course catalogue for AI agents.
Academic literature search, retrieval, and private library management on top of OpenAlex.
Integrates Wolfram Language and Wolfram|Alpha accessing curated data and sophisticated algorithms.
Related MCP Servers
- AlicenseAqualityCmaintenanceEnables searching and retrieving course details, schedules, prerequisites, and instructor information from the CMU course catalog via the ScottyLabs API.92MIT
- AlicenseNot gradedqualityDmaintenanceEnables interaction with Canvas courses and assignments through natural language, allowing retrieval, search, and summarization of course and assignment information.59 npm10MIT
- AlicenseAqualityCmaintenanceEnables course planning for University of Pennsylvania by searching the catalog, inspecting sections and ratings, detecting schedule conflicts, and building weekly schedules.15MIT
- FlicenseNot gradedqualityCmaintenanceProvides intelligent access to a university course catalog with full-text search, prerequisite tracking, instructor lookups, and course comparison prompts.-