School MCP
Fetches upcoming assignment deadlines, lists available courses, and downloads course materials and files
Adds deadlines to macOS Calendar or Reminders using AppleScript and manages local file downloads
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., "@School MCPwhat assignments are due this week?"
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.
School MCP
A Model Context Protocol (MCP) server for academic tools, integrating with Canvas and Gradescope platforms.
Features
Assignment Deadlines: Fetch and display upcoming deadlines from Canvas and Gradescope
Calendar Integration: Add deadlines to macOS Calendar or Reminders using AppleScript
File Management: Download course materials from Canvas
Related MCP server: moodle-mcp
Quickstart
Installation
Installing via Smithery
To install School MCP for Claude Desktop automatically via Smithery:
npx -y @smithery/cli install @54yyyu/school-mcp --client claudeClone the repository:
git clone https://github.com/yourusername/school-mcp.git
cd school-mcpInstall the package:
pip install -e .Set up your environment variables by either:
Using the included setup helper (recommended)
Creating a
.envfile manually
Using the Setup Helper
Run the setup helper to configure Claude Desktop automatically:
python setup_helper.pyThe setup helper will:
Find your Claude Desktop configuration file
Create a
.envfile if neededConfigure the MCP server with proper paths
Add your environment variables to the Claude Desktop configuration
Manual Setup
If you prefer to set up manually:
Copy the environment template:
cp .env.template .env
# Edit .env with your credentialsConfigure Claude Desktop by following the Claude Desktop Integration Guide.
Running the server
Run directly:
python -m school_mcpOr use the convenience script:
./run_server.pyCLI: cw / coursework
pip install -e . also installs a command-line tool, cw (long name coursework):
cw deadlines # unsubmitted work due in the next 14 days (Canvas + Gradescope)
cw deadlines -s canvas -d 7 # Canvas only, next week
cw announcements -u # unread course announcements
cw inbox -u # unread Canvas inbox conversations
cw message 512758 # read a thread (does not mark it read)
cw grades 20.201 # per-assignment scores for one course
cw files 6.7810 --compare ~/Desktop/MIT/6.7810 --missing # what's not filed locally yet
cw page 7.36 L15 # read a lecture page; its files grouped by label (Main Papers, ...)
cw download crispr # download a course's files (or --id ID ... for a selection; -j N files at once)
cw use columbia # switch the active accountCourses can be named by code, name fragment or Canvas id. Every command has
-h, --json, and (where it talks to a school) -a ACCOUNT.
A Claude Code skill for the CLI lives in skill/coursework/; symlink it into
~/.claude/skills/ to make it available in every session.
MCP Tools
get_deadlines: Fetch upcoming assignment deadlines from Canvas and Gradescopeadd_to_reminders: Add assignments to macOS Reminderslist_courses: List all available Canvas courseslist_course_files: List a course's files (with the page label each sits under) without downloadingget_course_page: Read a course Page, or list a course's pagesdownload_course_files: Download files from a Canvas courseset_download_path: Configure where downloaded files are savedget_download_path_info: Check the current download location
Configuration
The server tries to find configuration in this order:
Environment variables
.envfile in the current directoryExisting
config.jsonfile in the home directory
License
MIT
Available Tools
10 toolsadd_to_remindersB
Add upcoming deadlines to macOS Reminders.
Args: days_ahead: Number of days to look ahead for assignments (default: 14) account: School account to use (defaults to the active account)
| Name | Required | Description | Default |
|---|---|---|---|
| account | No | ||
| days_ahead | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are supplied, so the description carries the full burden for a mutation tool that writes into a user's Reminders database. It says nothing about whether repeated calls create duplicates, whether it is idempotent, what each reminder looks like, or that Reminders access must be authorized — all material facts for an agent deciding to invoke it.
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 purpose sentence is front-loaded and short, and the Args block is compact with no filler. The docstring formatting is slightly mechanical but does not waste space.
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?
An output schema exists, so return values need not be described. But for an unannotated write operation with zero schema descriptions, the definition omits side effects, duplicate behavior, and authorization requirements — the gaps an agent most needs closed before calling it.
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?
Schema description coverage is 0%, so the description must compensate, and it largely does: it explains that days_ahead is the look-ahead window for assignments and that account defaults to the active one. The only shortfall is that account does not point to list_school_accounts for valid values.
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 states a specific verb and resource: 'Add upcoming deadlines to macOS Reminders.' That is far more informative than the bare name and identifies the target application. However, it does not distinguish itself from the sibling get_deadlines, which presumably surfaces the same deadlines without writing them.
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?
'Upcoming deadlines' plus the days_ahead window implies when the tool applies, but there is no explicit when-to-use statement, no mention of the sibling get_deadlines as the read-only alternative, and no prerequisites (macOS Reminders availability, permissions, account already switched).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
download_course_filesA
Download files from a Canvas course (all of them, or a selection).
Args: course_id: Canvas course ID download_path: Root to download into for this call (default: the saved download path; never changes it) file_ids: Only these file ids (from list_course_files) since: Only files created/updated since YYYY-MM-DD or N days ago ("7d") flat: Put files directly in the root instead of // folders account: School account to use (defaults to the active account)
| Name | Required | Description | Default |
|---|---|---|---|
| flat | No | ||
| since | No | ||
| account | No | ||
| file_ids | No | ||
| course_id | Yes | ||
| download_path | 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 burden and does real work: it discloses that download_path does not mutate the saved setting ("never changes it"), that account defaults to the active account, and that folder layout depends on flat. It does not cover overwrite behavior for existing files, directory creation, or failure modes for a write-to-disk operation.
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 one-line purpose is front-loaded and the Args block is terse with no filler. The raw docstring format is slightly less scannable than prose, but no sentence is wasted.
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 six-parameter filesystem-writing tool, the definition covers selection, location, layout, and account routing, and an output schema exists so return values need no explanation. The remaining gap is file-collision and path-permission behavior, which an agent would want before calling it on a populated directory.
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?
Schema description coverage is 0%, so the description must compensate, and it does: every one of the six parameters gets meaning, including accepted date syntax for since (YYYY-MM-DD or "7d"), the default-inheritance semantics of download_path and account, and the layout consequence of flat. This is substantially more than the bare types in 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 opening line names a specific verb and resource ("Download files from a Canvas course") and immediately bounds scope with "all of them, or a selection." It also routes to the sibling list_course_files for obtaining file ids, so an agent can tell it apart from the listing tool without opening either schema.
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?
Usage context is clear: bulk download by default, narrowed via file_ids or since, and file_ids are explicitly sourced from list_course_files. There is no explicit when-not guidance (e.g., use get_course_page for single pages, or list_course_files to preview before downloading), which keeps it short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_course_pageA
Read a Canvas Page, such as a lecture page with its readings. Without
page, list the course's pages (module pages first; many courses hide the
Pages list from students).
Args: course: Course id, code (e.g. "7.36") or name fragment page: Piece of the page title (e.g. "L15") or its url slug account: School account to use (defaults to the active account)
Returns the page text plus its file links, each with section (the label it
sits under on the page, e.g. "Main Papers" or "Additional reading") and
hidden (true when the link has no visible text).
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | ||
| course | Yes | ||
| account | 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 disclosure burden and does reasonably well: it identifies the operation as a read, describes listing order (module pages first), discloses the student-visibility caveat that explains empty results, and describes the return payload (page text plus file links tagged with `section` and `hidden`). It omits auth/account-switching mechanics and any failure modes beyond the hidden-list caveat.
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?
Front-loaded with the core action and mode switch, then a compact Args block and a one-line Returns block. Every sentence carries information; only minor waste is the slightly redundant restatement of return values already covered by the output schema.
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 3-parameter tool with no annotations, the description covers all parameters, both operating modes, list ordering, and visibility caveats. Since an output schema exists, the return description is optional garnish rather than a gap; only account/error handling is left implicit.
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?
Schema description coverage is 0%, yet the Args block fully compensates: `course` accepts an id, code like "7.36", or name fragment; `page` accepts a title fragment like "L15" or a url slug; `account` defaults to the active account. These are exactly the disambiguations an agent needs and none exist in 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?
States a specific verb and resource ("Read a Canvas Page, such as a lecture page with its readings") and explicitly defines a second mode ("Without `page`, list the course's pages"). The distinction from file-oriented siblings like list_course_files and get_deadlines is evident from the object being read.
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?
Gives an explicit condition that switches behavior: omit `page` to list, supply `page` to read. It also warns that many courses hide the Pages list from students, which tells the agent to expect empty listings. It stops short of naming sibling tools as alternatives or saying when to prefer list_course_files.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_deadlinesC
Get upcoming deadlines from Canvas and Gradescope.
Args: days_ahead: Number of days to look ahead for assignments (default: 14) account: School account to use (defaults to the active account)
| Name | Required | Description | Default |
|---|---|---|---|
| account | No | ||
| days_ahead | 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 behavioral burden and does not state that this is a read-only, non-destructive call, nor what credentials/account linkage are required for Canvas and Gradescope. It discloses the two sources and the default lookahead window, but says nothing about what happens when an account isn't linked to one of the platforms or whether results are merged/deduplicated.
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 one-line purpose is front-loaded and the Args block is compact with no redundant wording. The Python-style Args formatting is slightly out of place for a JSON tool definition but costs nothing in clarity.
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?
An output schema exists, so return values needn't be explained, and only two optional parameters are involved. Still missing for a cross-platform aggregation tool: what happens with unlinked accounts, whether both sources are always queried, and any time-zone assumption on the deadline window.
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?
Schema description coverage is 0%, so the description must compensate, and it does partially: days_ahead is defined as the lookahead window with the same default of 14, and account is described as the school account with a default to the active one. It still doesn't say what form account takes (name, ID, or a value from list_school_accounts), leaving ambiguity for a 0%-coverage 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?
States a specific verb and resource ("Get upcoming deadlines") plus the two data sources (Canvas and Gradescope), which distinguishes it from siblings like list_courses or add_to_reminders. It does not explicitly say how it relates to list_courses (which presumably lists assignments), so the differentiation is implicit rather than stated.
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?
No guidance on when to call this versus list_courses, list_course_files, or add_to_reminders. The only contextual hint is that account defaults to the active account, implicitly pointing at switch_school_account, but no explicit when/when-not conditions are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_download_path_infoA
Get the current default download path for Canvas files.
| 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?
No annotations are supplied, but the tool is a zero-argument read, so the behavioral surface is small and 'get the current default' implies a non-mutating read. The description does not say what is returned when no custom path is configured (e.g. an OS default), which is the one behavioral detail an agent might need.
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?
A single front-loaded sentence with no filler; the resource and scope are stated immediately with nothing extraneous.
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?
With zero parameters and an output schema covering the return value, the description is nearly complete. The only missing element is the fallback behavior when no download path has been set, a minor gap given 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 tool takes no parameters, so there is nothing for the description to disambiguate and the baseline of 4 applies.
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 gives a specific verb+resource pair (get + current default download path) scoped to Canvas files, which cleanly contrasts with the sibling set_download_path. It stops short of naming that sibling explicitly, so an agent must infer the pairing from the get/set naming.
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?
Usage is only implied: the get/set naming against the sibling set_download_path makes the intent reasonably obvious, but there is no statement of when to call this versus set_download_path or any prerequisite conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_course_filesA
List every file download_course_files would fetch for a course, without downloading: modules, assignments (attachments + description links), Files tab, Pages, announcements, deduped by file id.
Args: course: Course id, code (e.g. "20.201") or name fragment since: Only files created/updated since this date (YYYY-MM-DD) or N days ago ("7d") compare_dir: Local folder to check against; each file gets local.status have / changed / missing (matched by name+size, then content hash; any layout) account: School account to use (defaults to the active account)
| Name | Required | Description | Default |
|---|---|---|---|
| since | No | ||
| course | Yes | ||
| account | No | ||
| compare_dir | 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 burden and does well: it enumerates every source scanned (modules, assignments with attachments and description links, Files tab, Pages, announcements) and discloses dedupe-by-file-id, which tells the agent the result set is normalized rather than raw. It implies a read-only no-side-effect operation via 'without downloading', but never explicitly states that nothing is written to disk or that auth/account context is required.
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 summary sentence is front-loaded and does the heavy lifting before any parameter detail, and the Args block is scannable. Slight verbosity in the nested compare_dir explanation, but every clause conveys usable information rather than filler.
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?
An output schema exists so return values needn't be explained, yet the description still discloses the local.status vocabulary the agent will encounter. For a four-parameter read tool with no annotations, the description covers sources, dedupe, filtering formats, and the compare mode — nothing material is missing.
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?
Schema coverage is 0%, so the description must compensate and it does: course accepts an id, code like '20.201', or name fragment; since accepts YYYY-MM-DD or relative '7d'; compare_dir explains the matching strategy (name+size then content hash, any layout) and the have/changed/missing statuses it produces; account defaults to the active account. All four parameters gain meaning not present in 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?
States a specific verb and resource ('List every file... for a course') and immediately scopes it against the sibling tool: it lists exactly what download_course_files would fetch, 'without downloading'. An agent can distinguish this preview tool from its download counterpart without opening either schema.
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?
Usage is strongly implied by the contrast with download_course_files — this is the inspect-before-you-download path — and the compare_dir parameter hints at a sync-check workflow. However, it never states an explicit 'use this when...' rule or any when-not guidance, leaving the agent to infer the workflow position.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_coursesC
List available courses from Canvas.
Args: account: School account to use (defaults to the active account)
| Name | Required | Description | Default |
|---|---|---|---|
| account | 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 behavioral burden and does little: it does not say whether this returns only enrolled courses or every course visible to the account, whether archived/concluded courses are included, whether results are paginated, or whether any permission is required. Because an output schema exists, return shape need not be described, but the scope and safety profile of the call remain undisclosed.
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 definition is short and the core purpose is front-loaded in the first sentence. The Python docstring 'Args:' formatting is slightly noisy but does not obscure meaning, and no sentence is wasted.
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 one-parameter list tool with an output schema, this is close to adequate, but the absence of annotations plus the undefined course scope (enrolled vs. all, active vs. concluded) leaves a real gap an agent would want filled. The default-account behavior is a useful addition that partly offsets this.
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?
Schema description coverage is 0%, so the description must compensate for the single 'account' parameter. It does partly: it explains the parameter is the school account and that it defaults to the active account, but it never says what form the value takes (name, ID, slug) or how to discover valid values via list_school_accounts.
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 gives a specific verb and resource ('List available courses from Canvas'), which is clear enough to distinguish it from siblings like list_course_files or get_course_page. It does not, however, explicitly differentiate itself from account-management siblings such as list_school_accounts or state whose courses (enrolled vs. all in the account) are returned.
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?
There is no when-to-use guidance, no exclusions, and no mention of when to call switch_school_account or list_school_accounts first. The only usage signal is the parenthetical that account defaults to the active account, which is helpful context but not selection guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_school_accountsA
List the configured school accounts (e.g. columbia, mit) and show which one is active.
| 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?
No annotations are supplied, so the description carries the full behavioral burden. It discloses scope (configured accounts) and that an active flag is included, but says nothing about permissions, whether the list is environment- or user-scoped, or whether any state changes—though the read-only nature is strongly implied by 'List'.
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?
A single sentence that front-loads the verb and resource, with the active-account detail immediately after. Nothing is padded or repeated from the schema.
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?
An output schema exists, so return structure needs no explanation, and with zero parameters the surface area is small. The only shortfall is the absence of guidance tying it to switch_school_account, which would fully close the loop.
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 takes zero parameters, so there is nothing for the description to disambiguate; baseline credit applies. The examples of account identifiers (columbia, mit) give useful context about what the returned values look like.
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 pairs a specific verb (List) with a specific resource (configured school accounts) and adds that the active one is marked, which separates it from the mutation sibling switch_school_account. It does not name the sibling explicitly, so routing relies on the reader inferring list vs switch.
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?
Usage is only implied: an agent can infer this is the discovery step before switching accounts, but the description states no when-to-use condition, no exclusions, and does not point at switch_school_account as the follow-up action.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_download_pathC
Set the default download path for Canvas files.
Args: path: Path to save downloaded files to
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full disclosure burden, yet it says nothing about persistence (is this saved across sessions?), whether the directory must already exist, whether missing directories are created, or whether existing files are affected. For a configuration-mutating tool this leaves the agent without the information needed to predict side effects.
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 body is a single front-loaded sentence followed by a brief Args block, with no filler. It is short almost to a fault, but nothing is wasted or buried.
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?
An output schema exists, so return values need not be explained, but the tool mutates a persistent setting with zero annotation coverage and an undocumented parameter. For a mutable-configuration tool the description should at minimum cover persistence and directory expectations, and it covers neither.
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?
Schema description coverage is 0%, so the description must compensate, but "Path to save downloaded files to" only restates the parameter name. It omits absolute vs. relative paths, platform-specific formats, whether a trailing separator or file name is expected, and permission requirements.
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?
States a specific verb (set) and resource (default download path for Canvas files), which is clear enough to act on. It does not differentiate from the sibling get_download_path_info, which reads the same setting, so the read/write split must be inferred from the names alone.
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?
There is no when-to-use guidance, no mention of prerequisites (e.g., whether download_course_files depends on this setting), and no reference to the sibling tools. The agent must guess the relationship between setting the path and actually downloading files.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
switch_school_accountB
Switch the active school account. Persists across restarts.
Args: account: Account name, e.g. "columbia" or "mit"
| Name | Required | Description | Default |
|---|---|---|---|
| account | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the full burden. It usefully discloses that the setting persists across restarts, which signals global state mutation, but says nothing about validation of the account name, what happens on an unknown account, or whether the switch affects the output of siblings like get_deadlines and list_courses.
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 short and front-loaded with the action and the persistence note, with no wasted prose. The docstring-style "Args:" block is slightly mechanical but earns its place by supplying the only parameter examples available.
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?
An output schema exists, so return values need not be explained, but for a stateful switch affecting many sibling tools the description should say where valid account names come from and what an invalid name does. As written it is minimally sufficient but leaves the main failure mode undocumented.
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?
Schema coverage is 0%, so the description must supply meaning, and it does add two concrete examples ("columbia", "mit") and a format hint (account name). However, it does not indicate whether these are the only valid values or that list_school_accounts enumerates them, leaving the parameter only partially specified.
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?
Description states a specific verb and resource ("Switch the active school account"), which is unambiguous and clearly distinct from the sibling list_school_accounts. It stops short of explicitly naming that sibling as the way to discover valid accounts, so it does not fully differentiate.
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?
There is no guidance on when to call this versus list_school_accounts, nor any prerequisite such as checking which accounts exist before switching. The only contextual hint is that the change persists, which is behavioral rather than usage guidance.
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.
10 tool updates
v0.1.0- First observed
add_to_reminders - First observed
download_course_files - First observed
get_course_page - First observed
get_deadlines - First observed
get_download_path_info - First observed
list_course_files - First observed
list_courses - First observed
list_school_accounts - First observed
set_download_path - First observed
switch_school_account
TDQS
Scored across 10 tools
Each tool targets a distinct resource+action: account listing/switching, deadline aggregation, reminders export, course listing, file preview vs. download, page reading, and download-path get/set. The only potentially overlapping pair (list_course_files vs. download_course_files) is explicitly framed as dry-run preview versus actual fetch, and get/set_download_path are a clean complementary pair.
All ten names follow a strict verb_noun snake_case pattern (list_, switch_, get_, add_, download_, set_) with no camelCase or bare-noun outliers. Pluralization and object naming (course_files, school_account, download_path) are used consistently across related tools.
Ten tools is well within the sweet spot and every one earns its place: account management (2), deadlines/reminders (2), courses and files (3), pages (1), path config (2). Nothing looks like filler, and no obvious operation is split into redundant variants.
The surface covers the core student workflow end-to-end: pick an account, list courses, preview and download files, read pages, pull deadlines, and push them to Reminders. Minor gaps remain — no way to add/remove a school account, no per-assignment detail or grades view, and no way to clear/reset the download path — but agents can work around these.
Maintenance
Related MCP Connectors
Model Context Protocol server for Studex tools, notifications, and profile integrations
A comprehensive Model Context Protocol (MCP) server that enables AI assistants to interact with yo…
Markdown-based note-taking with a hosted MCP server. Your notes serve you and your AI.
Hosted Notion MCP server for Claude, ChatGPT and Cursor, with each action switched per account.
Related MCP Servers
- AlicenseBqualityDmaintenanceA Model Context Protocol server that enables interaction with the Canvas Learning Management System API, allowing users to manage courses, assignments, enrollments, and grades within Canvas.543,092 npm104JavaScriptMIT
- FlicenseNot gradedqualityBmaintenanceA Model Context Protocol (MCP) server that connects AI coding agents to your Moodle LMS. Fetch assignments, grades, deadlines, and sync everything to Obsidian automatically.-
- AlicenseNot gradedqualityDmaintenanceMCP server that integrates GitHub, Brightspace, Outlook, and local files, enabling natural language queries for assignments, grades, emails, calendar events, repositories, and file operations.MIT
- AlicenseNot gradedqualityBmaintenanceEnables 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.9MIT