Skip to main content
Glama

NTU Course Index MCP

A local, read-only MCP server for NTU Singapore course and exam schedules. It fetches undergraduate course data from NTU's public Class Schedule and General Access exam timetable, and graduate course-group schedules from NTU's GSLink/PGR timetable. It does not use third-party course databases.

Undergraduate indexes, sessions, and prerequisites come from NTU's current Class Schedule form; descriptions come from its Content of Courses form; exam dates come from the undergraduate Exam Timetable General Access form. Graduate groups come from the public GSLink/PGR timetable.

Install and run

Install uv and Python 3.10 or newer. Run the MCP server directly from GitHub with:

uvx --from git+https://github.com/pitchaya-s/ntu-stars-mcp.git ntu-course-index

For development and offline tests from a local checkout, run:

uv sync

The process uses MCP stdio, so it stays open while its MCP client is connected. Course responses are cached in memory for one hour by default. Set NTU_CACHE_TTL_SECONDS to change the cache time or use 0 to disable caching.

Related MCP server: University Course Catalog MCP Server

Codex setup

Register the local server with the Codex CLI:

codex mcp add ntu-course-index -- uvx --from git+https://github.com/pitchaya-s/ntu-stars-mcp.git ntu-course-index
codex mcp list

Replace the directory with the repository's absolute path on your machine. Codex stores this server in ~/.codex/config.toml. The equivalent entry is:

[mcp_servers.ntu-course-index]
command = "uvx"
args = ["--from", "git+https://github.com/pitchaya-s/ntu-stars-mcp.git", "ntu-course-index"]

Restart Codex after adding or changing the server.

Claude Code setup

Register the server for your user so it is available across Claude Code projects:

claude mcp add --scope user ntu-course-index -- uvx --from git+https://github.com/pitchaya-s/ntu-stars-mcp.git ntu-course-index
claude mcp get ntu-course-index

Check the connection with claude mcp list or /mcp inside Claude Code. See Claude Code's MCP guide for scope and configuration details.

Tools

Class schedule tools take academic_year and semester. NTU labels academic years by their first year, so academic_year: 2026 means AY2026/27. Semester is 1, 2, or "S" for Special Term. The exam lookup defaults to the latest published exam term; pass both academic_year and semester (1 or 2) to request a specific published term. It uses General Access, returns exam dates and times, and does not include exam-seat assignments. get_graduate_course_schedule returns the latest term published by GSLink/PGR.

Tool

Purpose

get_course

Course metadata and every index with all sessions

get_course_indexes

All indexes and complete lesson schedules

get_graduate_course_schedule

Graduate course class groups and scheduled sessions

get_undergraduate_exam_schedule

Undergraduate exam date, time, duration, and published-term notice

get_index_schedule

Full schedule for one index

compare_indexes

Shared sessions, index-specific sessions, and optional clash checks

find_matching_indexes

Filter by days, times, lesson types, teaching weeks, and supplied schedule clashes

Course metadata includes NTU's course description when the official Content of Courses page provides one. course_description_status distinguishes available, not_listed, and unavailable.

Graduate schedules use class groups rather than undergraduate index numbers. PGR reports the currently published term and does not provide teaching weeks.

Example inputs:

{"course_code":"SC2001","academic_year":2026,"semester":1}

Graduate lookup uses only the course code and returns NTU's currently published term:

{"course_code":"EE6102"}

Undergraduate exam lookup uses the latest public term, or an explicitly requested published semester:

{"course_code":"SC2001"}
{
  "course_code":"SC2001",
  "academic_year":2026,
  "semester":1,
  "constraints":{
    "avoid_days":["FRI"],
    "latest_end":"17:00",
    "require_sessions":[{"lesson_type":"TUT","day":"TUE","starts_at_or_after":"13:00"}]
  }
}

Pass a schedule from the same academic year and semester to against_sessions as time slots. The server accepts the day, start_time, end_time, and optional teaching_weeks fields from sessions returned by the other tools; extra fields such as course code and index are ignored. Two sessions clash only when their days and times overlap and their explicit teaching-week sets intersect. If week information is absent, overlap remains possible.

Unrecognized NTU day or time values are retained in raw_day or raw_time. Matching results with incomplete schedule information are marked status: "uncertain" rather than reported as confirmed matches.

Verify

The offline parser, scheduling, error-handling, and MCP-client tests use saved official HTML fixtures:

uv run python -m unittest discover -s tests -v

The live stdio smoke test launches through uvx and makes real requests to NTU for SC2001, SC2207, and MH2802 in AY2026 semester 1, plus SC2001 in AY2025 semester 2:

uv run python tests/live_smoke.py

The undergraduate exam smoke test exercises NTU's public General Access flow through MCP:

uv run python tests/live_exam_smoke.py

Verified response examples

Live official pages fetched on 2026-10-21 returned 36 indexes for SC2001, 13 for SC2207, and 12 for MH2802 in AY2026 semester 1. For SC2001 index 10143, the endpoint lists two shared LEC/STUDIO sessions, a Tuesday TUT from 16:30 to 17:20 in TR+7 during weeks 2–13, and a Monday LAB from 10:30 to 12:20 in HWLAB2 during odd weeks 1–13.

get_index_schedule returns a structured object shaped like:

{
  "course_code":"SC2001",
  "index":"10143",
  "schedule_complete":true,
  "sessions":[
    {"lesson_type":"TUT","group":"SCEA","day":"TUE","start_time":"16:30","end_time":"17:20","venue":"TR+7","teaching_weeks":[2,3,4,5,6,7,8,9,10,11,12,13],"remarks":"Teaching Wk2-13"}
  ]
}

The public exam timetable currently lists SC2001's AY2026 Semester 1 exam on 2026-11-23 at 13:00 for 120 minutes. The response carries NTU's notice that the timetable may change; exam-seat assignments are published separately.

Limits

STARS vacancy lookup is not implemented yet.

Available Tools

7 tools
compare_indexesB
Read-onlyIdempotent

Compare shared and index-specific sessions; optionally check clashes with supplied time slots.

ParametersJSON Schema
NameRequiredDescriptionDefault
indexesYes
semesterYes
course_codeYes
academic_yearYes
against_sessionsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, openWorldHint and idempotentHint, so the safety profile is covered. The description adds the clash-checking behavior, which is useful, but says nothing about how shared vs index-specific differences are reported or that this is a pure computation over existing schedule data.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with no filler — the core compare action comes first and the optional clash check is appended. It is efficient, though arguably under-specified for a five-parameter tool rather than merely concise.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists so return values need not be explained, but for a tool with four required parameters and zero schema coverage the description omits the meaning and accepted forms of nearly every input. An agent could not reliably populate course_code, indexes, academic_year or semester from this text.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% across five parameters, so the description carries the burden and largely fails it. Only the optional against_sessions ("supplied time slots") is hinted at; course_code, indexes, academic_year and the semester enum (including the "S" value) are given no meaning, format or cardinality guidance anywhere.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ("Compare") plus the resources being compared ("shared and index-specific sessions"), which is more concrete than a restatement of the name. It does not, however, differentiate itself from the near neighbours like find_matching_indexes or get_index_schedule, so sibling disambiguation is left to the agent.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

"optionally check clashes with supplied time slots" implies when the against_sessions parameter is relevant, which is genuine usage context. But there is no explicit when-to-use/when-not guidance and no reference to the obvious alternatives (find_matching_indexes, get_index_schedule) that an agent would weigh this against.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

find_matching_indexesA
Read-onlyIdempotent

Find indexes matching day/time/lesson/week rules and avoiding supplied timetable clashes.

ParametersJSON Schema
NameRequiredDescriptionDefault
semesterYes
constraintsNo
course_codeYes
academic_yearYes
against_sessionsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already declare readOnlyHint, openWorldHint, and idempotentHint, so the safety profile is covered. The description adds that the tool avoids supplied timetable clashes and matches day/time/lesson/week rules, which is useful behavioral context, but it does not explain how constraints interact, how uncertainty is handled, or what volume of results to expect.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The definition is a single, front-loaded sentence with no redundant or filler language. Every clause contributes to understanding what the tool searches for and what it avoids.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema available and rich nested schema definitions for TimeSlot, TimeWindow, SearchConstraints, and SessionRequirement, the description need not explain return values or every nested field. The one-sentence summary is broadly complete for a constrained search tool, though it leaves usage and required-parameter semantics to inference.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Top-level schema description coverage is low, so the description must compensate. It loosely maps to constraints ('day/time/lesson/week rules') and against_sessions ('supplied timetable clashes'), but it does not explain the required course_code, academic_year, and semester parameters or the detailed semantics of the nested constraint fields.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description gives a specific verb and resource: 'Find indexes,' and states the filtering criteria as 'day/time/lesson/week rules' and 'avoiding supplied timetable clashes.' It clearly describes a constrained search operation, but it does not explicitly distinguish itself from siblings such as get_course_indexes or compare_indexes.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied: call this when you need indexes that satisfy schedule constraints and avoid clashes. However, there is no explicit when-to-use versus when-not-to-use guidance, and no alternative sibling is named.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_courseB
Read-onlyIdempotent

Get course metadata and every index with its complete timetable.

ParametersJSON Schema
NameRequiredDescriptionDefault
semesterYes
course_codeYes
academic_yearYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint and openWorldHint, so the safety profile is covered. The description adds useful scope context by saying it returns *every* index with a *complete* timetable (a broad, full-expansion read rather than a paginated summary), but says nothing about authentication, rate limits, or behavior when the course/year/semester combination does not exist.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with zero filler. The returned scope is stated up front, so an agent can triage the tool in one read.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be explained, and the description does convey what the tool fetches. It is nevertheless incomplete for a 3-required-parameter tool whose parameters carry no documentation at all, particularly the ambiguous semester enum.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%: none of course_code, academic_year, or semester is documented anywhere. The description only vaguely implies a course identifier is involved and adds nothing about the semester enum values (1, 2, 'S'), which are especially cryptic without explanation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Get course metadata and every index with its complete timetable'), which is clearer than a bare 'get course'. However it never differentiates itself from the sibling get_course_indexes or get_index_schedule, so an agent must infer which of the two overlapping-sounding tools to call.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no when-to-use guidance, no prerequisites, and no mention of any alternative tool. With siblings like get_course_indexes and get_index_schedule that plausibly overlap, the absence of routing guidance is a real gap.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_course_indexesB
Read-onlyIdempotent

List all indexes for a course, including every lecture, tutorial, lab, and other session.

ParametersJSON Schema
NameRequiredDescriptionDefault
semesterYes
course_codeYes
academic_yearYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and openWorldHint, so the safety profile is covered. The description adds useful scope information about what the returned index set contains (every lecture, tutorial, lab, and other session), but says nothing about permissions, result size, or pagination behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with no filler. The verb and resource come first and the inclusion scope follows immediately, so nothing needs to be trimmed or reordered.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return-format explanation is unnecessary, and annotations cover the read-only/idempotent profile. However, with three required parameters at 0% schema description coverage, the definition never tells the agent how to supply course_code, academic_year, or semester, leaving a real gap for a tool this simple.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% and the description mentions none of the three required parameters. It does not clarify the course_code format, the academic_year convention, or the meaning of semester values (though 1/2/'S' is at least enumerated in the schema). With low coverage, the description should compensate but does not.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('List') and resource ('indexes for a course'), then scopes the result by naming the session types included (lecture, tutorial, lab, other). It clearly distinguishes itself from schedule-oriented siblings by being a course-level index listing, though it never names an alternative tool explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No explicit when-to-use, prerequisites, or alternative routing is given. Usage is only implied by the purpose statement ('list indexes for a course'), which is adequate for a simple lookup but leaves the relationship to siblings like get_index_schedule, compare_indexes, and find_matching_indexes for the agent to infer.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_graduate_course_scheduleB
Read-onlyIdempotent

Get a graduate course's class groups for NTU's currently published academic term.

ParametersJSON Schema
NameRequiredDescriptionDefault
course_codeYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and openWorldHint, so safety is covered. The description adds a genuinely useful behavioral constraint beyond them: only the currently published academic term is served, so historical terms are unavailable. It still says nothing about behavior when a course code is not found.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One tight sentence with the resource front-loaded and the temporal scope trailing. No filler, though it is arguably too terse to carry the parameter burden.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be explained, and the term scoping is covered. The remaining gap is the undocumented course_code format, which is the one thing an agent must get right to invoke the tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% for the single required parameter course_code, so the description carries the burden. 'A graduate course's' only loosely implies that course_code identifies the course; no format, example, or case sensitivity is given.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Get) and resource (a graduate course's class groups) with the scope qualifier 'currently published academic term'. The 'graduate' qualifier implicitly separates it from get_undergraduate_exam_schedule, though it never names a sibling explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No when-to-use guidance, no prerequisites, and no mention of alternatives such as get_index_schedule or get_course. The agent must infer from the name alone which schedule tool applies.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_index_scheduleC
Read-onlyIdempotent

Get every scheduled session for one course index.

ParametersJSON Schema
NameRequiredDescriptionDefault
indexYes
semesterYes
course_codeYes
academic_yearYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

C2.7/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and openWorldHint, so the safety profile is covered structurally. The description adds no behavioral context beyond that — no mention of pagination, term-scoping behavior, or what happens when an index has no sessions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single efficient sentence with the object of the operation front-loaded, no filler. Its brevity is appropriate to the sentence itself, though it leaves the tool under-specified rather than genuinely concise.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be described. However, for a tool with four required, undocumented parameters and no usage framing, the description is too thin to let an agent call it confidently versus its five schedule-related siblings.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

All four parameters (course_code, index, academic_year, semester) are required with 0% schema description coverage, so the description carries the full burden — yet it only obliquely references 'course index'. It adds no format, range, or interpretation guidance for semester, academic_year, or the index value.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource ('Get every scheduled session') scoped to 'one course index', so an agent can tell it retrieves schedule data rather than course metadata or index lists. It does not distinguish itself from siblings like get_graduate_course_schedule or get_undergraduate_exam_schedule, which cover overlapping schedule territory.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no explicit when-to-use, when-not-to-use, or alternative tool named. The phrase 'for one course index' only weakly implies you must already have an index (presumably from get_course_indexes); nothing tells the agent how this differs from the other schedule tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_undergraduate_exam_scheduleA
Read-onlyIdempotent

Get public General Access exam dates and times for a course in the latest or specified published term.

ParametersJSON Schema
NameRequiredDescriptionDefault
semesterNo
course_codeYes
academic_yearNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover read-only, idempotent, and open-world behavior, and the description adds real context on top: results are limited to 'public General Access' exams (excluding restricted/non-public exam types) and the term defaults to the latest published one when not supplied. It stops short of stating what happens when no published schedule exists.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single tight sentence with the resource and the default-term behavior front-loaded and no filler. Every clause carries information the agent needs.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be described, and the safety profile is handled by annotations. The remaining gap is the undocumented parameter formats (0% schema coverage) and the absence of any routing hint toward the graduate or index-schedule siblings.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It clarifies that course_code identifies the course and that semester/academic_year are optional, defaulting to the latest published term, but it gives no format for academic_year (e.g. 2024 vs 24) or semester values beyond the schema enum.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb ('Get') plus a precise resource: public General Access exam dates and times for a course. The word 'undergraduate' in the name plus 'General Access' scoping separates it from get_graduate_course_schedule, though the description never names that sibling explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied by 'for a course' and by the 'latest or specified published term' phrasing, which tells the agent the term arguments are optional. There is no explicit when-to-use vs when-not guidance and no pointer to get_graduate_course_schedule for graduate courses.

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.

  1. 7 tool updatesv0.1.0
    • First observedcompare_indexes
    • First observedfind_matching_indexes
    • First observedget_course
    • First observedget_course_indexes
    • First observedget_graduate_course_schedule
    • First observedget_index_schedule
    • First observedget_undergraduate_exam_schedule

TDQS

B3.3/5.0

Scored across 7 tools

Disambiguation3/5

get_course returns course metadata AND every index with its complete timetable, which substantially overlaps with get_course_indexes (list all indexes) and get_index_schedule (one index's sessions). An agent could reasonably pick any of the three for overlapping needs. The exam/graduate schedules and the compare/find pair are clearly distinct, but the course/index trio blurs boundaries.

Naming Consistency4/5

All names follow a verb_noun pattern (get_course, get_index_schedule, find_matching_indexes, compare_indexes) with snake_case throughout. The graduate/undergraduate schedule names are longer and add scope qualifiers, a minor deviation but still readable and predictable.

Tool Count5/5

Seven tools is well-scoped for a course-index lookup domain, covering distinct resource/action combinations without bloat. No trivial single tool or excessive surface.

Completeness4/5

The surface covers course metadata, index listing, per-index schedules, graduate/undergraduate scheduling, exam dates, index comparison, and clash-aware matching, which is strong lifecycle coverage. Some gaps remain, such as no explicit search-by-course-code tool, but core planning workflows are supported.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    D
    maintenance
    Enables course planning for University of Pennsylvania by searching the catalog, inspecting sections and ratings, detecting schedule conflicts, and building weekly schedules.
    15
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    Enables natural-language queries across multiple schools' Canvas and Blackboard accounts for courses, notifications, assignments, grades, feedback, and schedules, with read-only access and local todo/calendar export.
    7
    MIT
  • A
    license
    A
    quality
    A
    maintenance
    Gives AI assistants direct, on-demand access to McGill's public Visual Schedule Builder timetable data, letting them search course offerings, fetch sections and meeting times, check conflicts, and generate ranked schedule combinations without a login, API key, or browser session. Queries and schedule calculations run locally on structured results, with a short-lived cache for repeated requests.
    4
    12 npm
    2
    MIT