Skip to main content
Glama

quercus-mcp

An MCP server that lets Claude read your University of Toronto Quercus courses: assignments, due dates, grades, announcements, files, and modules.

Quercus runs on Canvas LMS, so it also works with any school that uses Canvas.

Ask Claude things like:

  • "What's due this week across all my courses?"

  • "Summarize the latest announcements in MAT188."

  • "What's my current grade in CIV100?"

  • "Find the lecture slides for week 3 in my calculus course."

How it works

The server runs locally on your computer and talks to the Canvas REST API with a personal access token that you create. Your token stays on your machine. It is only ever sent to your school's Canvas server, never anywhere else.

Every tool is read-only. The server can't submit work, post, or change anything in your account.

Related MCP server: Canvas LMS MCP Server

Setup

Requirements: Node.js 18 or newer, and Claude Code or Claude Desktop.

1. Get a Quercus access token

  1. Sign in to Quercus.

  2. Go to Account → Settings → Approved Integrations.

  3. Click + New Access Token, give it a name like "Claude", and copy the token.

Treat this token like a password. Anyone who has it can read your Quercus account.

2. Install and build

git clone https://github.com/lance-lii/quercus-mcp.git
cd quercus-mcp
npm install
npm run build

3. Connect it to Claude

Claude Code:

claude mcp add quercus -s user \
  -e QUERCUS_API_TOKEN=<your token> \
  -e QUERCUS_BASE_URL=https://q.utoronto.ca/api/v1 \
  -- node /absolute/path/to/quercus-mcp/dist/index.js

Start a new Claude Code session afterwards so it picks up the new tools. Check the connection with claude mcp get quercus.

Claude Desktop: add this to your claude_desktop_config.json and restart the app:

{
  "mcpServers": {
    "quercus": {
      "command": "node",
      "args": ["/absolute/path/to/quercus-mcp/dist/index.js"],
      "env": {
        "QUERCUS_API_TOKEN": "<your token>",
        "QUERCUS_BASE_URL": "https://q.utoronto.ca/api/v1"
      }
    }
  }
}

Using a different Canvas school

Set QUERCUS_BASE_URL to your school's Canvas API, for example https://yourschool.instructure.com/api/v1, and create the token from that school's Canvas settings page.

Tools

Tool

What it does

list_courses

Your active, completed, or all enrolled courses

list_assignments

Assignments for a course, optionally filtered (upcoming, overdue, ungraded, and more)

get_course_grades

Your grade and enrollment info for one course

list_all_grades

Your grades across all courses

list_announcements

Announcements for one or more courses

list_todo

Your Quercus to-do list

list_upcoming_events

Upcoming events and due dates

list_calendar_events

Calendar events or assignments in a date range

list_files

Files in a course

get_file_download_url

Metadata and an authenticated download link for a file

get_course_modules

A course's modules and their items

Security notes

  • Keep your token out of git. .env is already in .gitignore. Copy .env.example to .env if you'd rather keep your token in a file.

  • If a token leaks, delete it under Approved Integrations in Quercus and create a new one.

  • Check your school's policies on third-party tools before using this.

Development

npm run build   # compile TypeScript to dist/
npm start       # run the server over stdio

Source is in src/: canvas.ts handles the API client and pagination, and index.ts defines the tools.

Disclaimer

This is an independent student project. It isn't affiliated with or endorsed by the University of Toronto or Instructure.

License

MIT © 2026 Lance Li

Available Tools

11 tools
get_course_gradesGet grades for a courseC

Get the current user's grades/enrollment info for a specific course.

ParametersJSON Schema
NameRequiredDescriptionDefault
course_idYes

TDQS

C2.7/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full behavioral burden. It implies a read of the calling user's own data, but says nothing about permissions, whether enrollment info is always present, error behavior for invalid courses, or the shape of the result.

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 tight sentence with the resource and scope front-loaded. Efficient, though it is arguably under-specified rather than optimally 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?

For a read tool with no annotations and no output schema, the description should convey at least the return shape (grades vs. enrollment fields) and course_id format. It leaves both unresolved, so an agent cannot fully predict the response.

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 single course_id parameter is a bare string with no format, example, or source hint in either the schema or the description. The description only implies the parameter is course-scoped, adding no real semantic 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?

States a specific verb (get) and resource (current user's grades/enrollment info) scoped to a specific course. It is distinguishable from siblings like list_all_grades, though the description never explicitly names that sibling to sharpen the contrast.

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 guidance on when to use this over list_all_grades or the other list_* siblings, and no stated prerequisites. The agent must infer that this is the per-course variant of a broader grades listing.

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

get_course_modulesList course modulesC

List the modules (and items) for a Quercus course.

ParametersJSON Schema
NameRequiredDescriptionDefault
course_idYes

TDQS

C2.7/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full behavioral burden, and it discloses almost nothing beyond the read operation implied by 'List'. It omits pagination behavior, permission/auth requirements, and the shape or nesting of the returned modules/items.

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 wasted words, though it is arguably too terse for the parameter and return details an agent would need.

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?

With no annotations, no output schema, and an undocumented required parameter, the description leaves significant gaps for an agent to call this correctly. The parenthetical '(and items)' hints at return structure but does not compensate for the missing course_id semantics and behavioral details.

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 there is one required parameter, course_id, which is completely undocumented in the schema. The description only weakly implies that 'a Quercus course' corresponds to course_id, giving no format or sourcing guidance for the identifier.

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 (List) and resource (modules, plus items) scoped to a Quercus course, so the agent knows what it retrieves. It does not explicitly name or distinguish itself from siblings like list_files or list_assignments, but the resource noun 'modules' is unambiguous.

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 guidance on when to use this tool versus alternatives (e.g., list_files for content), nor any prerequisites or exclusions. The agent can only infer usage from the name and resource.

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

get_file_download_urlGet a file's download URLB

Resolve a Quercus file ID to its metadata and authenticated download URL.

ParametersJSON Schema
NameRequiredDescriptionDefault
file_idYes

TDQS

B3.3/5.0
Behavior3/5

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

With no annotations, the description carries the full burden, but it does disclose one meaningful trait: the returned URL is 'authenticated,' signaling credential requirements that a plain ID-to-URL mapping would not imply. It says nothing about URL expiry, permission scoping, or rate limits, so transparency remains partial.

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?

One sentence, zero waste, with the resource and the return value front-loaded. Nothing redundant against the title.

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?

For a simple one-param lookup with no annotations and no output schema, the description covers what is returned (metadata + URL) but omits how to source the file_id and any URL lifetime or auth caveats an agent would need to use the result correctly.

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 coverage is 0% for the single file_id parameter. The description does clarify that the ID is a Quercus file ID rather than an arbitrary string, but it does not explain the ID format or where to obtain it, leaving the parameter only partly compensated.

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+resource: resolve a Quercus file ID to metadata and an authenticated download URL. The purpose is unambiguous and distinct from read-only listers like list_files, though it never names a sibling to differentiate itself 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 guidance on when to use this versus list_files, nor on the prerequisite of obtaining a file_id first. The agent must infer the workflow entirely from the name and description.

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

list_all_gradesList grades across all coursesA

List the current user's enrollments and grades across all active courses.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.6/5.0
Behavior3/5

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

No annotations are provided, so the description carries the full burden. It usefully discloses scope constraints (only the current user's data, only active courses), but says nothing about pagination, result ordering, or how grades are structured per course. Coverage of behavior beyond the name is partial.

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 scope constraint is stated immediately and every word earns its place.

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?

With no output schema and no annotations, the description is the only carrier of return-value information. It says the result contains enrollments and grades but not how they are grouped, whether grade values are final/current, or what empty results look like — a gap for a data-retrieval tool.

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

Parameters4/5

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

The tool takes zero parameters, so there is no parameter surface for the description to clarify. Baseline 4 applies; the description correctly adds no invented parameter discussion.

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 (enrollments and grades) with clear scope: the current user, across all active courses. The 'all active courses' scope implicitly separates it from the per-course sibling get_course_grades, though that sibling is never named.

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 only implied by the scope phrase 'across all active courses' — an agent can infer this is the aggregate view versus the course-specific get_course_grades. No explicit when-to-use or when-not-to-use guidance is given, and no alternative is named.

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

list_announcementsList announcementsC

List announcements for one or more courses (context_codes like 'course_12345').

ParametersJSON Schema
NameRequiredDescriptionDefault
course_idsYes

TDQS

C2.9/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full behavioral burden, yet it says nothing about being a read-only operation, authentication/permission requirements, pagination, result limits, or whether unpublished announcements are included. For a listing tool with zero annotation coverage this is a substantial gap.

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 resource and scope come first. It is efficient, though the parenthetical format hint arrives slightly late in the sentence.

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?

With no output schema, no annotations, and a parameter whose schema documents nothing, the description should say more about return shape or pagination. For a simple one-parameter list tool it is minimally adequate but leaves real gaps.

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 does clarify the required ID format ('context_codes like course_12345') and that multiple courses are accepted, which the bare 'array of strings' schema does not convey, but it leaves cardinality limits and matching behavior unexplained.

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 (announcements) and adds scope ('for one or more courses'), so an agent knows exactly what is returned. It does not differentiate itself from siblings like list_courses or list_todo, though the resource noun is distinct enough that confusion is unlikely.

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 statement of when to use this tool versus alternatives, no prerequisites (e.g. enrollment, permissions), and no exclusions. Usage is only inferable from the tool name and the plural-course scope.

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

list_assignmentsList assignments for a courseC

List assignments for a given Quercus course, optionally filtered by bucket.

ParametersJSON Schema
NameRequiredDescriptionDefault
bucketNo
course_idYes

TDQS

C2.8/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full behavioral burden. 'List' implies a read, but it says nothing about pagination, result ordering, auth requirements, or what each bucket actually returns. For a tool with zero annotation coverage this is a notable gap.

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 tight sentence with the required scope front-loaded and the optional filter trailing. No waste, though it is arguably too terse given the undocumented parameters.

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?

A simple two-parameter read tool with no output schema and no annotations: the description covers the core action, but the enum semantics and any return-shape expectations are absent, which is the minimum viable level.

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%, so the description must compensate. It notes the bucket filter exists but does not explain the seven enum values (past, overdue, undated, ungraded, unsubmitted, upcoming, future) or how course_id is supplied, leaving the agent to guess at semantics.

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), resource (assignments), and scope (for a given Quercus course) with an optional filter. Sibling tools cover different resources (courses, grades, announcements, todo), so the resource noun alone differentiates it, though no sibling is named 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 guidance on when to use this over list_todo or list_upcoming_events, which likely overlap for deadline-oriented tasks. The optional bucket is mentioned but no condition for when filtering is appropriate versus listing all.

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

list_calendar_eventsList calendar eventsB

List calendar events/assignments in a date range across given course context codes.

ParametersJSON Schema
NameRequiredDescriptionDefault
typeNo
end_dateYesISO date, e.g. 2026-09-30
course_idsYes
start_dateYesISO date, e.g. 2026-09-01

TDQS

B3/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full behavioral burden. It implies a read-only list operation, but does not disclose return format, pagination, permissions, or whether the optional type parameter filters events versus assignments.

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?

It is a single front-loaded sentence with no wasted words, clearly stating the operation and its primary scope.

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?

Given 4 parameters, no output schema, no annotations, and 50% schema coverage, the description is too thin. It omits the type parameter, return behavior, and any filtering or pagination details needed for correct invocation.

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 only 50%. The description adds meaning for the date range and course context codes, but it does not explain the optional 'type' parameter or its enum values, leaving a significant gap for parameter usage.

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 'List' and resource 'calendar events/assignments', plus scope (date range, course context codes). It is clear but does not explicitly distinguish itself from siblings like list_upcoming_events or list_assignments.

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?

The date range and course context codes imply when to use it, but there is no explicit guidance on when to choose this over list_upcoming_events or list_assignments, and no exclusions or alternatives named.

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

list_coursesList coursesC

List the user's Quercus courses.

ParametersJSON Schema
NameRequiredDescriptionDefault
enrollment_stateNo

TDQS

C2.7/5.0
Behavior2/5

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

With no annotations, the description carries the full behavioral burden, yet it only implies read-only via 'List'. It discloses nothing about auth requirements, pagination, rate limits, or whether inactive/completed courses are included by default.

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. It is appropriately sized, though its brevity comes at the cost of the missing detail noted elsewhere.

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?

With no output schema, no annotations, and one undocumented filtering parameter, the description is too thin to let an agent invoke this correctly — it cannot know the default enrollment filter or the shape of the returned course list.

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 single parameter enrollment_state (enum: active/completed/invited_or_pending/all) is never mentioned. The description does not explain the filter, its default, or its impact on results, leaving a documented-in-name-only parameter.

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 ('List') and resource ('the user's Quercus courses'), so the agent knows exactly what it returns. It does not, however, distinguish itself from sibling list tools such as list_assignments or list_all_grades beyond the resource noun.

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 guidance on when to call this versus the many sibling list_* tools, no prerequisites, and no exclusions. The agent must infer usage entirely from the resource name.

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

list_filesList course filesC

List files available in a Quercus course.

ParametersJSON Schema
NameRequiredDescriptionDefault
course_idYes

TDQS

C2.8/5.0
Behavior2/5

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

With no annotations, the description carries the full behavioral burden, and it discloses almost nothing: no pagination behavior, no permission/enrollment requirements, no statement about whether hidden or unpublished files are included, and no indication of what each entry contains. "Available in a Quercus course" is the only scope hint.

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 short, front-loaded sentence with no wasted words. It is efficiently structured, though its brevity edges toward under-specification rather than ideal conciseness.

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?

For a one-parameter list tool with no output schema, the definition is minimally viable, but it omits return shape, pagination, and the relationship to get_file_download_url. Those gaps are the kind an agent would need to call this correctly in a multi-step workflow.

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 there is one required parameter (course_id). The phrase "in a Quercus course" loosely implies course_id identifies the course, but adds nothing beyond what the parameter name already conveys, so it fails to compensate for the undocumented schema.

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+resource ("List files") scoped to a Quercus course, which clearly separates it from list_assignments, list_announcements, and list_courses. It does not, however, explicitly name or distinguish itself from the closely-related get_file_download_url sibling.

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 or when-not-to-use guidance, and no mention of the natural alternative get_file_download_url for actually retrieving file content. An agent must infer everything about when this list tool is appropriate.

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

list_todoList to-do itemsA

List the current user's Quercus to-do items (ungraded submissions, upcoming quizzes, etc.).

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.7/5.0
Behavior3/5

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

No annotations are supplied, so the description carries the burden. It discloses useful behavioral context: the scope is the current user (no filtering parameters) and the content spans ungraded submissions and upcoming quizzes. However, it says nothing about ordering, pagination, or whether the list is exhaustive, which are typical concerns for an unfiltered list endpoint.

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 core scope front-loaded and the parenthetical examples earning their place by disambiguating what a 'to-do item' means. No filler.

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?

For a zero-parameter read-only list tool with no output schema, the description covers the essentials: whose items, what kind, and the domain (Quercus). Return value structure is unspecified, but no output schema exists, so a modest gap remains around ordering and completeness.

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

Parameters4/5

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

The tool takes zero parameters, so the schema baseline is 4 and there is nothing for the description to clarify or compensate for. It correctly conveys that the listing is scoped to the current user without options.

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 ('the current user's Quercus to-do items') with concrete examples (ungraded submissions, upcoming quizzes) that pin down what counts as a to-do. It is distinguishable from siblings like list_assignments or list_upcoming_events by content, though it does not explicitly contrast itself with them.

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 the examples of what appears in the list, giving the agent a sense of when this tool is relevant, but there is no explicit when-to-use, when-not-to-use, or named alternative. With siblings such as list_upcoming_events and list_assignments potentially overlapping, an explicit boundary would help.

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

list_upcoming_eventsList upcoming eventsB

List the current user's upcoming Quercus events and assignment due dates.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

B3.1/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full behavioral burden. 'List' weakly implies a read-only operation, but nothing is said about ordering, the time horizon of 'upcoming', result caps, or what fields come back.

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 that front-loads the resource. It is not padded, though it is arguably under-specified rather than maximally economical of information.

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?

For a zero-parameter, no-output-schema tool, the description should at minimum state the default window for 'upcoming' and the ordering of results. It specifies the content (events plus due dates) but leaves the temporal scope undefined.

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

Parameters4/5

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

The tool takes zero parameters, so there is no schema semantics to add and the baseline of 4 applies. The description correctly asserts this is a no-argument call by not implying any filters.

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 clear verb+resource ('List ... upcoming Quercus events and assignment due dates') and scopes it to the current user. It does not, however, distinguish itself from close siblings like list_calendar_events or list_assignments, leaving overlap unresolved.

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 at all. With siblings such as list_calendar_events and list_assignments available, an agent gets no signal about whether this is the aggregate/upcoming view or when to prefer those alternatives.

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. 11 tool updatesv1.0.0
    • First observedget_course_grades
    • First observedget_course_modules
    • First observedget_file_download_url
    • First observedlist_all_grades
    • First observedlist_announcements
    • First observedlist_assignments
    • First observedlist_calendar_events
    • First observedlist_courses
    • First observedlist_files
    • First observedlist_todo
    • First observedlist_upcoming_events

TDQS

B3.3/5.0

Scored across 11 tools

Disambiguation4/5

Most tools target distinct resources (courses, assignments, grades, announcements, files, modules). The only meaningful overlap is between list_upcoming_events and list_calendar_events, both of which return events/assignment due dates, though descriptions clarify one is upcoming and the other is a custom date range.

Naming Consistency5/5

Every tool uses snake_case with a consistent verb_noun pattern: all are either list_* or get_* prefixed. The convention is applied uniformly across all 11 tools.

Tool Count5/5

11 tools is a well-scoped set for a Quercus integration, covering the main read-only resources without unnecessary bloat. Each tool has a clear purpose.

Completeness3/5

The surface is entirely read-only (list/get) and lacks any create, update, or delete operations, such as submitting assignments, posting to discussions, or uploading files. While read coverage is solid, these are notable gaps for an LMS agent.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers