Skip to main content
Glama

canvas-control

canvas-control turns Canvas LMS into a fast, scriptable download pipeline and exposes it to AI assistants via MCP.

  • Download files from multiple Canvas content sources in one command

  • Sync course files like git pull — skip unchanged, re-download on demand

  • Check grades across all courses from the terminal or export to CSV/JSON

  • Submit assignments from the terminal (file upload, text entry, URL)

  • Talk to Canvas through AI assistants (Claude Desktop, Cursor, Claude Code) — search files, download by name or type, sync courses, and set paths in natural language

Star History

Star History Chart

Related MCP server: Canvas MCP

Table of contents

Why canvas-control

  • One command downloads from files, assignments, discussions, pages, and modules.

  • Built for repeatable workflows: predictable output paths, machine-readable manifests, idempotent re-runs.

  • Guided mode (download interactive) for beginners, fully scripted mode (download run) for power users.

  • Grades accessible from the terminal: summaries, per-assignment breakdowns, CSV/JSON export.

  • MCP server lets AI assistants query courses, grades, assignments, and sync files with natural language.

Quick start

canvas-control uses uv for environment and dependency management.

  1. Create and activate a virtual environment (Python 3.12+):

uv venv --python 3.12
source .venv/bin/activate
  1. Install the project and dev dependencies:

uv pip install -e '.[dev]'
  1. Set your Canvas base URL once:

cvsctl config set-base-url https://your-school.instructure.com
  1. Set CANVAS_TOKEN (see configuration docs) or let cvsctl prompt for it.

  2. Run the onboarding wizard to configure everything interactively, or jump straight to your first command:

# Guided setup (recommended for first-time users)
cvsctl onboard

# Or go straight to listing your courses
cvsctl courses list

MCP server (AI assistants)

canvas-control includes an MCP (Model Context Protocol) server so you can interact with Canvas through AI assistants using natural language.

Available tools

Tool

Description

list_courses

List enrolled courses (active or all)

get_upcoming_assignments

Assignments due within a time window

get_announcements

Recent course announcements

get_calendar_events

Calendar events within a time window

get_syllabus

Course syllabus content

get_grades_summary

Grade overview across courses

get_grades_detailed

Per-assignment grade breakdown

list_course_files

List all files in a course (raw)

search_course_files

Search files by name, type, or folder — preview before downloading

download_file

Download a single file by ID

download_selected_files

Download a batch of specific files to a local directory

set_download_path

Save a download path to config (global or per-course)

complete_assignment

Mark assignment complete (submission or module completion flow)

sync_course_files

Sync all course files to local disk; supports custom destination

Natural language file downloads

Three new tools enable a conversational download workflow directly from Claude Desktop or Cursor:

**search_course_files** — search before you download. Filter by name substring, file extension, or folder path. The assistant shows you a preview of matching files so you can confirm before anything hits disk.

**download_selected_files** — download a batch of specific files (by Canvas file ID) to any local directory. Skips files that already exist, so it's safe to re-run. Returns a per-file status: downloaded, skipped, or failed.

**set_download_path** — persist a directory path to config so you don't have to specify it every time. Set a global default or a per-course path.

**sync_course_files** — now accepts an optional destination parameter, so you can tell the assistant exactly where to put everything without touching config first.

Example conversation:

You: Search for PDF files in my Biology course
Claude: Found 8 PDFs — Lecture 1.pdf, Lecture 2.pdf, Syllabus.pdf …

You: Download those to ~/Documents/Bio
Claude: Downloaded 7, skipped 1 (already exists). Saved to ~/Documents/Bio.

You: Save that as my default path for Biology
Claude: Saved ~/Documents/Bio as the download path for Biology (course 12345).

Claude Desktop

Add to ~/Library/Application Support/Claude/claude_desktop_config.json:

{
  "mcpServers": {
    "canvas": {
      "command": "uv",
      "args": ["--directory", "/path/to/canvas-control", "run", "cvsctl", "mcp", "serve"],
      "env": {
        "CANVAS_TOKEN": "your-token",
        "CANVAS_BASE_URL": "https://your-school.instructure.com",
        "CANVAS_TIMEZONE": "America/Los_Angeles"
      }
    }
  }
}

Cursor

Add to .cursor/mcp.json in your project or ~/.cursor/mcp.json globally:

{
  "mcpServers": {
    "canvas": {
      "command": "uv",
      "args": ["--directory", "/path/to/canvas-control", "run", "cvsctl", "mcp", "serve"],
      "env": {
        "CANVAS_TOKEN": "your-token",
        "CANVAS_BASE_URL": "https://your-school.instructure.com",
        "CANVAS_TIMEZONE": "America/Los_Angeles"
      }
    }
  }
}

Claude Code

claude mcp add canvas -- uv --directory /path/to/canvas-control run cvsctl mcp serve

Set CANVAS_TOKEN, CANVAS_BASE_URL, and optionally CANVAS_TIMEZONE in your shell profile or .envrc.

Example prompts

Courses, grades, and assignments:

  • "What classes am I taking?"

  • "What assignments are due this week?"

  • "Show my grades for Biology"

  • "Are there any new announcements?"

  • "Mark Homework 2 complete"

Downloading files:

  • "Search for slides in my CS101 course"

  • "Download the lecture PDFs from my Biology course to ~/Documents/Bio"

  • "Save ~/Documents/Bio as my default download path for Biology"

  • "Sync all files from my Time Series course to ~/Documents/School"

  • "Re-download all files for Biology, overwriting existing ones"

CLI highlights

Download all files for a course:

cvsctl download run --course 12345

View grades at a glance:

cvsctl grades summary

Export grades to CSV:

cvsctl grades export --detailed

Guided interactive download:

cvsctl download interactive

Submit an assignment:

cvsctl assignments submit --course 12345 --assignment "Homework 1" --file ./solution.py

See CLI Reference for the full command tree and all options.

Documentation

  • Configuration — token setup, download paths, per-course paths

  • CLI Reference — full command tree and behavior notes

  • Guides — workflows, grades, interactive mode, troubleshooting

Dev Testing

When changes are merged into the main branch, update your local clone and reinstall so the MCP server picks up the latest code.

  1. Pull the latest changes:

git pull origin main
  1. Reinstall the package (picks up new dependencies or entry-point changes):

uv pip install -e '.[dev]'
  1. Run the test suite to verify nothing is broken:

uv run pytest
  1. Restart the MCP server in your AI client so it spawns a fresh process:

  • Claude Desktop: quit and relaunch the app

  • Cursor: open Settings → MCP and click the refresh/reconnect button

  • Claude Code: the server is spawned per-session; start a new session

Contributing

  1. Create a branch for your change.

  2. Implement focused changes and tests.

  3. Run tests:

uv run pytest
  1. Optional live smoke test (requires real Canvas credentials):

export CANVAS_BASE_URL="https://your-school.instructure.com"
export CANVAS_TOKEN="your-token"
export CANVAS_TEST_COURSE_ID="12345"
uv run pytest -m live
  1. Open a PR with what changed, why, and test coverage.

Available Tools

14 tools
complete_assignmentA

Complete or submit an assignment in Canvas.

When online submission is available and no submission payload is provided, this tool responds with needs_input and tells the caller what is required. If no supported submission path exists, it attempts module item completion.

ParametersJSON Schema
NameRequiredDescriptionDefault
assignment_nameNo
assignment_idNo
course_idNo
file_pathsNo
text_submissionNo
url_submissionNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior4/5

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

No annotations are provided, so the description carries full responsibility. It discloses two key behavioral traits: returns 'needs_input' when no payload is given, and attempts module item completion if no submission path exists. This provides useful context for the agent's decision-making.

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 description is concise, consisting of two sentences that immediately state the purpose and then detail key behavioral nuances. Every sentence adds value with no redundancy, and the structure is front-loaded with the primary verb and resource.

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?

While the description explains the conditional outcomes (needs_input and module completion), it does not cover how to provide submission payloads or what the output schema returns. Given the tool's complexity (6 parameters, conditional logic), the description is adequate but lacks completeness in guiding the agent on parameter usage and expected outcomes.

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?

The input schema has 6 parameters with no descriptions (0% coverage). The tool description does not explain any parameter's meaning, format, or how they relate to the submission process. The agent must rely solely on parameter names, which are vague (e.g., 'text_submission', 'url_submission').

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

Purpose5/5

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

The description clearly states 'Complete or submit an assignment in Canvas' with a specific verb and resource. It distinguishes from siblings by describing conditional behaviors like needs_input response and module item completion, which are unique to this tool.

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 description implies usage when one needs to complete an assignment, but it does not explicitly state when to use this tool versus alternatives or when not to use it. No exclusions or alternative tools are mentioned, leaving the agent with limited guidance.

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

download_fileA

Download a single file from Canvas by file ID.

Args: file_id: The Canvas file ID. destination: Optional local path. Defaults to ~/Downloads/.

ParametersJSON Schema
NameRequiredDescriptionDefault
file_idYes
destinationNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/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 burden. It discloses the default destination behavior, which is helpful. However, it does not mention possible failures (e.g., file not found), authentication requirements, or any side effects. The description is adequate but could benefit from adding more behavioral context.

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 description is very concise: a single sentence for the main purpose followed by a clear bulleted list for parameters. No redundant information. Every sentence earns its place.

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?

Given the low parameter count (2), the presence of an output schema (so return values need not be explained), and the clear purpose, the description is nearly complete. It could optionally mention that the file is downloaded to the local filesystem, but the default destination already implies that. Overall, covers the key points well.

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 input schema provides parameter names and types but minimal descriptions (0% coverage). The description compensates by explaining that file_id is a Canvas file ID and destination is an optional local path with a default. This adds meaningful context beyond the schema.

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

Purpose5/5

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

The description clearly states the action ('Download'), the resource ('a single file'), the source ('from Canvas'), and the identifier ('by file ID'). This is specific and distinguishes it from sibling tools like download_selected_files (multiple files) and sync_course_files (sync operation).

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

Usage Guidelines4/5

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

The description implies usage for downloading a single file by ID, which indirectly distinguishes it from alternatives. However, it does not explicitly state when not to use it or provide direct references to sibling tools. The sibling names give context, but the description could be more explicit.

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

download_selected_filesA

Download a batch of specific Canvas files to a local directory.

Skips files that already exist at the destination (safe to re-run).

Args: file_ids: List of Canvas file IDs to download (from search_course_files). destination: Local directory path to save files to. ~ is expanded.

ParametersJSON Schema
NameRequiredDescriptionDefault
file_idsYes
destinationYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior3/5

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

With no annotations, description covers idempotency (skip existing) and destination expansion, but lacks details on errors, permissions, or return values.

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?

Two sentences, no fluff, front-loaded purpose.

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?

Adequate for a simple tool with 2 parameters and an output schema; could mention output but overall sufficient.

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

Parameters5/5

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

Adds crucial context beyond schema: file_ids are Canvas file IDs from search_course_files, destination supports ~ expansion.

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

Purpose5/5

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

Clearly states it downloads a batch of specific Canvas files, distinguishing from sibling tools like download_file (single file) and sync_course_files (sync all).

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

Usage Guidelines4/5

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

Notes that it's safe to re-run because it skips existing files, and that file_ids come from search_course_files. Does not explicitly contrast with alternatives but implies usage context.

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

get_announcementsA

Get recent announcements from Canvas courses.

Args: course_id: Optional course ID to filter. If omitted, gets from all active courses. limit: Maximum number of announcements to return (default 10).

ParametersJSON Schema
NameRequiredDescriptionDefault
course_idNo
limitNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/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 discloses that it retrieves 'recent' announcements and provides parameter defaults, but does not mention read-only status, potential errors, or output format. Adequate but not rich.

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

Conciseness5/5

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

The description is highly concise: one sentence for purpose followed by a clear list of arguments. Every sentence is necessary, no fluff, and front-loaded with the core action.

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 simple retrieval tool with two parameters and an output schema, the description covers the essentials. It could mention ordering or pagination, but overall is sufficient for an agent to invoke correctly.

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

Parameters5/5

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

Schema description coverage is 0%, so the description fully explains both parameters: course_id as optional filter ('gets from all active courses' if omitted) and limit as max announcements with default 10. Adds significant value beyond the schema.

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

Purpose5/5

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

The description clearly states 'Get recent announcements from Canvas courses' with a specific verb and resource. It also mentions optional filtering by course and a limit, which distinguishes it from sibling tools like get_calendar_events or get_grades.

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

Usage Guidelines4/5

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

The description provides clear context: when you need announcements, optionally filter by course_id. It does not explicitly state when not to use or list alternatives, but given no competing announcement tool exists, this is sufficient.

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

get_calendar_eventsA

Get calendar events within a time window.

Args: course_id: Optional course ID to filter. If omitted, gets events from all contexts. days_ahead: Number of days ahead to look (default 14).

ParametersJSON Schema
NameRequiredDescriptionDefault
course_idNo
days_aheadNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.9/5.0
Behavior2/5

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

No annotations are provided, and the description lacks behavioral details such as side effects (read-only operation), rate limits, timezone handling, or pagination behavior. It only covers basic functionality.

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 description is concise, front-loaded with the main purpose, and every sentence provides useful information without fluff.

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?

Given the existence of an output schema and two optional parameters, the description covers the core functionality but omits details like the start of the time window and potential pagination limits.

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?

With 0% schema description coverage, the description compensates by explaining the meaning of both parameters: course_id filter context and days_ahead default behavior. However, it does not specify the start time of the window (assumed current time).

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

Purpose5/5

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

The description clearly states the tool gets calendar events within a time window, specifying the resource and scope. It distinguishes from sibling tools like get_announcements and get_syllabus.

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

Usage Guidelines4/5

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

The description provides context on optional course_id filtering and default days_ahead, but does not explicitly state when to use this tool over alternatives or when not to use it.

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

get_grades_detailedB

Get detailed per-assignment grades for a specific course.

Args: course_id: The Canvas course ID.

ParametersJSON Schema
NameRequiredDescriptionDefault
course_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.4/5.0
Behavior2/5

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

No annotations are provided, so the description bears full responsibility for behavioral disclosure. It only states that it gets grades, without detailing if it is read-only, the scope of assignments returned, or any authentication or rate limit considerations.

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 description is extremely concise, consisting of one sentence and a parameter specification. Every word is necessary and placed front-loaded.

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?

Given that an output schema exists, the description need not detail return values. It adequately covers the tool's purpose and scope. It could be more complete by optionally mentioning that it returns all assignments, but that is implicit.

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?

The schema has 0% description coverage. The description adds minimal value by specifying that the parameter is a 'Canvas course ID', which helps interpret the integer. However, it does not provide format or constraints beyond the schema.

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

Purpose5/5

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

The description clearly states the verb 'Get', the resource 'detailed per-assignment grades', and the scoping 'for a specific course'. It effectively distinguishes from the sibling tool 'get_grades_summary', which presumably provides summary grades.

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?

The description provides no guidance on when to use this tool versus alternatives like 'get_grades_summary' or 'get_upcoming_assignments'. It does not mention prerequisites, exclusions, or context.

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

get_grades_summaryA

Get grade summary for enrolled courses.

Args: course_id: Optional course ID to filter. If omitted, shows all active courses.

ParametersJSON Schema
NameRequiredDescriptionDefault
course_idNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior3/5

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

No annotations are provided, so the description bears full responsibility. It implies a read-only operation but does not disclose any behavioral details beyond the basic functionality. Minimal but not misleading.

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?

Extremely concise: two lines that immediately state the purpose and parameter behavior. No unnecessary words, efficiently front-loaded.

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

Completeness5/5

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

Given the tool's simplicity (one optional parameter, existing output schema), the description covers all essential information: what it does and how the parameter works. No gaps.

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?

With 0% schema description coverage, the description adds essential meaning: the course_id filters to a specific course, and omitting it shows all active courses. This clarifies the parameter's purpose beyond the schema's type and default.

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

Purpose5/5

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

Description clearly states 'Get grade summary for enrolled courses', which is a specific verb ('Get') and resource ('grade summary'). It is distinct from sibling tools like 'get_grades_detailed', implying a higher-level overview.

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

Usage Guidelines4/5

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

Description explains that the course_id parameter is optional and if omitted returns all active courses. This provides clear context for when to use the filter, though no explicit alternative to sibling tools is given.

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

get_syllabusB

Get the syllabus for a specific course.

Args: course_id: The Canvas course ID.

ParametersJSON Schema
NameRequiredDescriptionDefault
course_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.1/5.0
Behavior2/5

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

No annotations are provided, and the description does not disclose behavioral traits such as error handling (e.g., missing course_id), authorization requirements, or any side effects. For a read operation, the description should at least confirm it is non-destructive.

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 description is extremely concise, using two short sentences to convey the purpose and parameter. Every word is necessary, and it is front-loaded with the core purpose.

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?

Given the single parameter and the presence of an output schema (so return details are not needed), the description is adequate but minimal. It does not describe what the syllabus content looks like (e.g., text, HTML) or any file path, which might be useful for an agent.

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?

The description includes 'course_id: The Canvas course ID,' which adds moderate value beyond the schema's type-only definition. However, with 0% schema coverage reported, the description could provide more context (e.g., format, example, or validation rules).

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 clearly states 'Get the syllabus for a specific course,' specifying the action (get) and resource (syllabus). It distinguishes from siblings like get_announcements or get_calendar_events, though it could be more explicit about the scope.

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 usage context is provided beyond the basic action. There is no guidance on when to use this tool vs. alternatives, prerequisites (e.g., course must be accessible), or when not to use it.

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

get_upcoming_assignmentsA

Get upcoming assignments that are due within a time window.

Args: course_id: Optional course ID to filter. If omitted, checks all active courses. days_ahead: Number of days ahead to look for due dates (default 14).

ParametersJSON Schema
NameRequiredDescriptionDefault
course_idNo
days_aheadNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior3/5

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

No annotations provided, so description carries the burden. It doesn't explicitly state read-only nature or discuss side effects, but the function is clearly a query. No contradictions.

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?

Extremely concise: two sentences plus Args section. Front-loaded main purpose with no wasted words.

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?

Given low complexity (2 simple params, output schema exists), the description covers essential behavior and parameter semantics. Could mention edge cases like empty results but not critical.

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 description adds meaning to both parameters (course_id optional, defaults to all courses; days_ahead default 14) beyond the schema, which lacks descriptions (0% coverage). It compensates well.

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

Purpose5/5

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

The description clearly states the tool retrieves upcoming assignments due within a time window, with specific verb 'get' and resource 'upcoming assignments'. It distinguishes from siblings like 'complete_assignment' and 'get_grades_detailed'.

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

Usage Guidelines4/5

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

The description explains when to use (for upcoming assignments within a time window) and includes optional filtering by course_id. However, it lacks explicit when-not-to-use or alternative suggestions among siblings.

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

list_course_filesC

List all files in a Canvas course.

Args: course_id: The Canvas course ID.

ParametersJSON Schema
NameRequiredDescriptionDefault
course_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

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 must disclose behavior. It only says 'List all files' without mentioning any limitations (e.g., pagination, folder structure, permission requirements). The output schema exists but is not referenced.

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

Conciseness3/5

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

The description is very short and front-loaded, but it lacks detail. While concise, it sacrifices informativeness. Every sentence is minimal but not fully earning 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?

An output schema exists, so return values are covered. However, the description is too sparse for a tool with siblings. It omits context like typical use cases or relationship to other tools.

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?

With 0% schema description coverage, the description should compensate. However, it merely restates 'course_id' as 'The Canvas course ID,' adding no format, constraints, or usage details beyond the parameter name.

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 clearly states 'List all files in a Canvas course,' specifying the verb (list) and resource (files in a course). It distinguishes from siblings like search_course_files and sync_course_files by the action, but does not explicitly differentiate.

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 tool versus alternatives (e.g., search_course_files for filtering, download_file for downloading). No context or exclusions provided.

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

list_coursesA

List Canvas courses. By default shows only active enrollments.

Args: include_all: If True, include concluded/past courses too.

ParametersJSON Schema
NameRequiredDescriptionDefault
include_allNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.9/5.0
Behavior3/5

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

The description discloses that by default only active enrollments are shown, and explains the include_all parameter. However, no annotations are present, and the description does not mention pagination, rate limits, or authorization requirements, which are relevant for a list tool.

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 description is extremely concise (two sentences plus an argument list) and front-loaded with the main purpose, with no wasted words.

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?

The tool has only one parameter and an output schema exists, so the description's brevity is partly justified. However, missing details about pagination or result limits reduce completeness for a list operation that may return many courses.

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 only parameter, include_all, is explained in the description as 'include concluded/past courses too', adding meaning beyond the schema's title and default. Schema description coverage is 0%, so the description compensates well.

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

Purpose5/5

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

The description clearly states 'List Canvas courses' with a specific verb and resource, and distinguishes from sibling tools (e.g., list_course_files) which list files, not courses.

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 or when-not-to-use guidance is provided, but the tool's purpose is clear and alternatives (sibling tools) are functionally distinct, so usage is implied.

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

search_course_filesA

Search for files in a Canvas course by name, extension, or folder.

Use this as a preview step before downloading — show the user what would be downloaded and let them confirm.

Args: course_id: The Canvas course ID. query: Case-insensitive substring to match in file display name or filename. file_type: File extension to filter by (e.g. "pdf", "docx"). Leading dot is stripped. folder: Case-insensitive substring to match in the Canvas folder path.

ParametersJSON Schema
NameRequiredDescriptionDefault
course_idYes
queryNo
file_typeNo
folderNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

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

No annotations provided, so description carries full burden. It discloses case-insensitive substring matching, leading dot stripping for file_type, and parameter behaviors. Lacks discussion of pagination or return volume, but output schema covers return structure.

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 description is short, front-loaded with purpose and usage hint, then a clear arg list. Every sentence adds value with no redundancy.

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

Completeness5/5

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

Given four parameters, no annotations, and existing output schema, the description covers all necessary aspects: parameter details, usage rationale, and behavioral notes. It is complete for the complexity level.

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

Parameters5/5

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

Schema description coverage is 0%, so description must compensate. It provides detailed semantics for all four parameters: course_id, query (case-insensitive substring), file_type (extension, leading dot stripped), and folder (case-insensitive path). This fully compensates for the missing schema descriptions.

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 clearly states it searches for files in a Canvas course by name, extension, or folder. This distinguishes it from list_course_files (which lists all files) but does not explicitly name the sibling.

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

Usage Guidelines4/5

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

Explicitly says to use as a preview step before downloading, giving a clear when-to-use context. Does not mention when not to use or alternative tools, but the context is sufficient.

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

set_download_pathA

Save a download path to the config file for future use.

Args: destination: Local directory path to persist. ~ is expanded. course_id: Optional course ID. If provided, saves a per-course path. If omitted, saves the global default download path.

ParametersJSON Schema
NameRequiredDescriptionDefault
destinationYes
course_idNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior3/5

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

Without annotations, the description adds behavioral details like '~ is expanded' and that the path persists to a config file. It does not disclose potential side effects (e.g., overwriting existing paths) or failure modes, but for a simple config tool this is adequate.

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 description is concise (two sentences plus an Args section), front-loaded with the purpose, and contains no extraneous information. Every sentence is necessary and earns its place.

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

Completeness5/5

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

Given the tool's simplicity (2 parameters, output schema exists), the description covers the core behavior and parameter semantics thoroughly. It does not need to explain return values as the output schema likely handles that.

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

Parameters5/5

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

With 0% schema description coverage, the description fully compensates by explaining 'destination' as a local directory with tilde expansion and 'course_id' as optional with distinct behavior. This adds critical meaning beyond the schema's type-only definitions.

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

Purpose5/5

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

The description clearly states the tool saves a download path to the config file, specifying the verb 'save' and the resource 'download path'. It is distinct from sibling tools that handle actual file downloading or course 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 description explains the two usage modes based on course_id (global vs per-course), providing context for when to use each. However, it does not explicitly contrast with alternative tools or state prerequisites, leaving the agent to infer usage timing.

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

sync_course_filesA

Sync (download) all files for a Canvas course to the local filesystem.

Behaves like "git pull" for course files — downloads new/changed files and skips unchanged ones. Set force=True to re-download everything.

Args: course_id: The Canvas course ID to sync. force: If True, overwrite existing files even if unchanged. sources: Content sources to include. Defaults to all (files, assignments, discussions, pages, modules). destination: Optional local directory path to save files to. ~ is expanded. Overrides the configured course path and default destination.

ParametersJSON Schema
NameRequiredDescriptionDefault
course_idYes
forceNo
sourcesNo
destinationNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior3/5

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

No annotations provided, so description carries full burden. Discloses incremental behavior, skip unchanged files, force re-download, and content sources. But missing details on directory creation, error handling, or concurrency. Adequate but not exhaustive.

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?

Highly concise: one sentence for purpose, one analogy, one note on force, then bullet list of args. No fluff. Front-loaded with main action. Every sentence is informative.

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?

Given 4 parameters, sibling tools, and existence of output schema, description covers core behavior, parameter semantics, and use case. Lacks guidance on invalid course ID handling, sync stop, or network dependency. Still reasonably complete for a file sync 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?

Schema has 0% description coverage, but description explains each parameter: course_id, force (re-download), sources (defaults to all types), destination (overrides configured path). Provides default values and behavior. However, does not specify allowed values for sources (e.g., exact strings like 'files', 'assignments'). Adds significant value beyond schema.

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

Purpose5/5

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

Clearly states 'Sync (download) all files for a Canvas course to the local filesystem.' Uses verb 'sync/download' and resource 'files for a course'. 'Behaves like "git pull"' analogy strongly distinguishes from sibling tools like download_file (single file) or download_selected_files (specific files).

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

Usage Guidelines4/5

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

Provides clear context: incremental sync vs. force re-download. Implicitly suggests use for updating local copies. However, lacks explicit when-not-to-use or comparison with alternatives like download_file or get_syllabus. Does not mention prerequisites like network connectivity.

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. 14 tool updatesv0.1.0
    • First observedcomplete_assignment
    • First observeddownload_file
    • First observeddownload_selected_files
    • First observedget_announcements
    • First observedget_calendar_events
    • First observedget_grades_detailed
    • First observedget_grades_summary
    • First observedget_syllabus
    • First observedget_upcoming_assignments
    • First observedlist_course_files
    • First observedlist_courses
    • First observedsearch_course_files
    • First observedset_download_path
    • First observedsync_course_files

TDQS

A3.7/5.0

Scored across 14 tools

Disambiguation4/5

Tools are mostly distinct, but download_file and download_selected_files overlap in purpose; descriptions help clarify. Similarly, sync_course_files could be confused with bulk download. Overall, most tools have clear boundaries.

Naming Consistency5/5

All tools follow verb_noun snake_case pattern consistently. Verbs are descriptive (get, list, download, complete, set, sync). No mixing of conventions.

Tool Count5/5

14 tools is appropriate for a Canvas LMS integration. Each tool covers a key feature area without unnecessary duplication.

Completeness4/5

Covers core Canvas features: courses, files, assignments, grades, announcements, calendar, syllabus. Missing individual assignment details and submission file upload, but complete_assignment handles submission with guidance. Minor gaps exist but a typical workflow can be completed.

Maintenance

ActivityInactive
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers