Skip to main content
Glama
Mattlo0546
by Mattlo0546

Canvas MCP Server: Canvas LMS for Claude, ChatGPT Codex and Cursor

License: MIT MCP Python 3.10+

canvas-mcp is an open-source Model Context Protocol (MCP) server for Canvas LMS (by Instructure). It lets AI assistants (Claude Desktop, Claude Code, ChatGPT Codex, Cursor, VS Code and SlideMate) read a student's Canvas courses, modules, deadlines and announcements. It can also download every course's lecture slides into one folder per course.

  • Works at any university that uses Canvas. It defaults to the University of Oxford (canvas.ox.ac.uk), and you set CANVAS_BASE_URL for anywhere else.

  • No API token needed. You sign in through your university's normal single sign-on (SSO) and MFA in a real browser window. Many universities, Oxford included, don't let students create Canvas access tokens. If yours does, CANVAS_TOKEN works too.

  • Read-only. It can't submit work, post or change anything on Canvas.

Using Moodle or Blackboard instead? See moodle-mcp (UCL, King's, LSE, Cambridge, Warwick…) and blackboard-mcp (Imperial, Edinburgh, Bristol, Leeds…).

What you can ask

  • "What's due on Canvas this week, and what haven't I submitted?"

  • "Any new announcements in my courses?"

  • "Show me week 3 of PPE101 and download the lecture slides."

  • "Pull every lecture PDF from all my current courses."

Related MCP server: Canvas LMS MCP Server

Tools

Tool

What it does

canvas_login

Opens a browser window for university SSO + MFA and saves the session. It tries a silent refresh first.

canvas_status

Which site you're on, who you're signed in as, and where files download to

canvas_courses

Your current courses, with their term

canvas_browse

A course's modules: files, pages, links and assignments with due dates

canvas_deadlines

Assignments, quizzes and discussions due in the next N days, with submission status

canvas_announcements

Recent announcements in one course, or in all of them

canvas_download

Save one file (a file_id from canvas_browse)

canvas_sync / canvas_sync_status

With no course: download the PDFs from every current course, in the background. With a course: download all of its files.

Courses can be named loosely: "PPE101", "philosophy" or the course id all work. A sync files things as <course code>/<module name>/<file>. It skips past courses and files you already have, and it still finds module files in courses that hide the Files tab from students.

Install

macOS / Linux, one command

This installs uv, which brings its own Python, so you don't need Xcode or Apple's Command Line Tools. Then it installs canvas-mcp and opens Chrome so you can sign in once:

curl -LsSf https://astral.sh/uv/install.sh | sh && ~/.local/bin/uv tool install --managed-python https://github.com/Mattlo0546/canvas-mcp/archive/refs/heads/main.zip && CANVAS_BASE_URL=canvas.ox.ac.uk ~/.local/bin/canvas-mcp login

Change canvas.ox.ac.uk to your university's Canvas address. Sign-in uses Google Chrome. Without Chrome, first run ~/.local/share/uv/tools/canvas-mcp/bin/playwright install chromium. To update later, add --reinstall after tool install.

Windows

powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
uv tool install --managed-python https://github.com/Mattlo0546/canvas-mcp/archive/refs/heads/main.zip
$env:CANVAS_BASE_URL="canvas.ox.ac.uk"; canvas-mcp login

Connect it to your AI app

Set CANVAS_BASE_URL to your university's Canvas address in each config below.

SlideMate

In SlideMate, go to Settings → Your university, then pick your university or Canvas and press Connect. SlideMate installs this server, signs you in and makes the library's Pull button download new slides. Nothing to type.

Claude Code

claude mcp add canvas -e CANVAS_BASE_URL=https://canvas.ox.ac.uk -- ~/.local/bin/canvas-mcp serve

Claude Desktop

Settings → Developer → Edit Config (claude_desktop_config.json):

{
  "mcpServers": {
    "canvas": {
      "command": "/Users/YOU/.local/bin/canvas-mcp",
      "args": ["serve"],
      "env": { "CANVAS_BASE_URL": "https://canvas.ox.ac.uk" }
    }
  }
}

ChatGPT Codex CLI

codex mcp add canvas --env CANVAS_BASE_URL=https://canvas.ox.ac.uk -- ~/.local/bin/canvas-mcp serve

Cursor (~/.cursor/mcp.json) and VS Code (.vscode/mcp.json, under "servers")

{
  "mcpServers": {
    "canvas": {
      "command": "/Users/YOU/.local/bin/canvas-mcp",
      "args": ["serve"],
      "env": { "CANVAS_BASE_URL": "https://canvas.ox.ac.uk" }
    }
  }
}

Universities that use Canvas

Any Canvas site works. These addresses were checked to be Canvas instances:

University

CANVAS_BASE_URL

University of Oxford

canvas.ox.ac.uk

University of Birmingham

canvas.bham.ac.uk

University of Liverpool

canvas.liverpool.ac.uk

University of Sussex

canvas.sussex.ac.uk

Harvard University

canvas.harvard.edu

Stanford University

canvas.stanford.edu

MIT

canvas.mit.edu

UC Berkeley (bCourses)

bcourses.berkeley.edu

UC San Diego

canvas.ucsd.edu

University of Michigan

umich.instructure.com

Columbia University (CourseWorks)

courseworks2.columbia.edu

Carnegie Mellon University

canvas.cmu.edu

National University of Singapore

canvas.nus.edu.sg

University of Newcastle, Australia

canvas.newcastle.edu.au

Your university's Canvas address is the one in your browser's address bar when you open Canvas. Often it's canvas.<university domain> or <name>.instructure.com.

Command line

canvas-mcp login          # sign in (opens Chrome)
canvas-mcp status         # who you're signed in as
canvas-mcp courses        # your current courses
canvas-mcp deadlines      # what's due in the next 14 days
canvas-mcp sync           # PDFs from every current course
canvas-mcp sync PPE101    # every file in one course

Settings (all optional)

Environment variables win over ~/.canvas-mcp/config.json.

Variable

Default

Meaning

CANVAS_BASE_URL

https://canvas.ox.ac.uk

Your Canvas site

CANVAS_TOKEN

none

A Canvas access token (Account → Settings → New access token), if your university allows them. It replaces the browser sign-in.

CANVAS_DOWNLOAD_DIR

SlideMate's first slides folder, else ~/CanvasFiles

Where downloads go

CANVAS_BROWSER_CHANNEL

chrome

Browser for sign-in. "" uses Playwright's own Chromium.

CANVAS_MCP_HOME

~/.canvas-mcp

Where the session and the sign-in browser profile are kept

How sign-in works

Canvas at most universities sits behind SAML or Shibboleth single sign-on with MFA, so there's no password a script can post. canvas_login opens your Canvas site in a real Chrome window and you sign in as usual. It waits until the Canvas REST API (/api/v1/users/self) answers, then saves that site's session cookies, readable only by you. The API client sends those cookies, exactly as the Canvas website does. The browser profile remembers your SSO session, so when the Canvas session lapses, the server signs back in headlessly with no clicks, for as long as your university's SSO allows.

FAQ

Is there a Canvas MCP server that works without an API token? Yes, this one. It signs in through your university's SSO in a browser, so it works where students can't create access tokens.

Does it work with ChatGPT? It works with OpenAI's Codex CLI and with any app that supports local (stdio) MCP servers. The ChatGPT website can only use remote MCP servers.

Can it submit assignments or post on Canvas? No. Every tool is read-only, apart from saving files to your own computer.

Where is my data stored? Only on your computer. The session is at ~/.canvas-mcp/session.json. Delete that file and ~/.canvas-mcp/browser-profile to sign out. Data goes straight between your computer and your university's Canvas.

Is it allowed? It only reads what you can already see when you're signed in, at about the pace of a person clicking through Canvas. Check your university's IT acceptable-use policy if you're unsure.

Development

uv run --with pytest pytest     # offline tests against a fake Canvas: pagination, hidden Files, expiry, stdio
  • moodle-mcp: MCP server for Moodle

  • blackboard-mcp: MCP server for Blackboard Learn (Ultra)

  • classroom-mcp: MCP server for Google Classroom

  • SlideMate: a free Mac app with an AI tutor that has read your whole lecture deck. It sets all of these up in one click.

MIT licensed. Not affiliated with Instructure or the University of Oxford. Canvas is a trademark of Instructure, Inc.

Available Tools

9 tools
canvas_announcementsA

Announcements posted in the last days days, newest first: in one course (id, code or part of the name), or in every current course when course is empty.

ParametersJSON Schema
NameRequiredDescriptionDefault
daysNo
courseNo

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?

With no annotations, the description carries the full behavioral burden. It usefully discloses result ordering (newest first) and the default scope when `course` is empty, but says nothing about authentication requirements, pagination, or result limits. An output schema exists, so return shape is covered elsewhere, keeping this at an adequate 3.

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 sentence, front-loaded with the resource and ordering, followed by the two scoping cases. No filler and no restatement of the tool name.

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 two-parameter read tool with an output schema, the description covers purpose, scope branching, ordering, and both parameters' semantics. The only omission is auth/pagination behavior, which is minor given the schema already defines return values.

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 description coverage is 0%, so the description must compensate, and it largely does: `days` is defined as the lookback window and `course` is described as accepting an id, a code, or a partial name, with the empty-string case meaning all current courses. It omits the default value of `days` (14), which the schema supplies.

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?

States a specific resource (announcements), a time window (last `days` days), an ordering (newest first), and the two possible scopes (one course vs. every current course). No sibling tool covers announcements, so there is no ambiguity to resolve, and an agent knows exactly what it will get back.

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 implicitly tells the agent when to use each mode: pass a course value for a single course, leave `course` empty for a cross-course sweep. It gives clear context but names no exclusions or alternative tools (e.g., nothing about when to prefer canvas_deadlines or canvas_courses instead).

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

canvas_browseA

Show a course's modules with their files, pages, links and assignments (with due dates). course can be a course id, course code, or part of the name. File items include a file_id for canvas_download.

ParametersJSON Schema
NameRequiredDescriptionDefault
courseYes

TDQS

A4.1/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 disclosure burden. It adds real behavioral context by noting that file items carry a file_id intended for canvas_download (interop beyond the schema), but it omits whether authentication is required, whether the call is read-only, and any pagination or size limits for large courses.

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 tight sentences with no filler; the return contents are front-loaded and the cross-tool hint is appended last. Every clause 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?

With no output schema, the description responsibly enumerates the returned structure (modules containing files, pages, links, assignments with due dates). The only real gap for correct invocation is the unstated authentication prerequisite implied by the sibling canvas_login.

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 coverage is 0%, so the description must compensate, and it does fully: the single `course` parameter is documented as accepting a course id, a course code, or part of the name. That resolves all ambiguity about valid input forms for the only parameter.

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?

States a specific verb ('Show') and resource ('a course's modules') and enumerates exactly what each module contains (files, pages, links, assignments with due dates). This distinguishes it from sibling list tools like canvas_courses or canvas_deadlines without needing to name 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 — browse within a single course — and it points forward to canvas_download for file_id items, which is a useful handoff. However, it never states when to prefer this over canvas_courses or canvas_deadlines, nor any prerequisites such as needing canvas_login first.

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

canvas_coursesA

List the user's Canvas courses (current ones, unless include_past).

ParametersJSON Schema
NameRequiredDescriptionDefault
include_pastNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.7/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 does disclose the key behavioral trait – default filtering to current courses – which is real value beyond the schema. It omits auth prerequisites (canvas_login), pagination/rate-limit behavior, and does not explicitly state that the operation is read-only.

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, front-loaded with the resource and the default behavior. Every clause earns its place with 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 simple read-only list tool with an output schema, the description plus schema is nearly sufficient – return values need not be described. The remaining gap is the missing authentication prerequisite and any note on result scoping, which would help an agent in a session that has not yet logged in.

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 description coverage is 0% for the single include_past parameter, so the description must compensate. It does: 'current ones, unless include_past' explains exactly what the flag toggles, which the bare boolean title does not.

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

Purpose4/5

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

Specific verb and resource: 'List the user's Canvas courses.' An agent immediately knows what it returns. It does not differentiate itself from siblings such as canvas_browse or canvas_deadlines, so it stops short of a 5.

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 parenthetical clarifies the default scope (current courses unless include_past), which is implied usage guidance for choosing the flag. However, it names no alternative tool and states no when-not-to-use condition, so it is adequate but thin.

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

canvas_deadlinesA

Assignments, quizzes and discussions due in the next days days (default 14), soonest first, with whether each has been submitted.

ParametersJSON Schema
NameRequiredDescriptionDefault
daysNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/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. It usefully discloses sort order (soonest first), the default window, and that submission status is included, but says nothing about auth requirements (a canvas_login sibling exists), pagination, or truncation limits for large course loads.

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 well-formed sentence with the resource list, window, and sort order front-loaded. No filler and nothing redundant.

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 one-optional-parameter read tool with an output schema, the description covers purpose, scope, ordering, and default adequately. Only auth/prerequisite context is absent, which is a minor gap given siblings like canvas_login exist.

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 coverage is 0% and the single parameter is only typed as an integer with a default. The description supplies the actual semantics — the window in days — which the schema does not, though it merely restates the default value already present in 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?

States a precise resource set (assignments, quizzes, discussions) plus scope (due in the next `days` days) and ordering (soonest first). An agent can immediately tell this apart from canvas_announcements or canvas_courses without opening a schema.

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 phrase 'due in the next `days` days (default 14)', which signals the upcoming-workflow context. However, there is no explicit when-to-use guidance, no when-not-to-use, and no sibling alternative named (e.g. vs canvas_courses for a full listing).

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

canvas_downloadA

Download one Canvas file (a file_id from canvas_browse) into // (or subdir).

ParametersJSON Schema
NameRequiredDescriptionDefault
courseYes
subdirNo
file_idYes

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 does disclose a real behavioral trait: the write destination (<download folder>/<course>/, overridable via subdir). But it says nothing about authentication (canvas_login is a sibling), overwrite/collision behavior, or failure modes for an invalid file_id.

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 sentence that front-loads the verb and resource, then qualifies scope and destination. Every clause earns its place, with no restatement of the tool name or filler.

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 three undocumented parameters, the description leaves important gaps: whether a local path is returned, whether an existing file is overwritten, and whether login is a prerequisite. For a tool whose whole purpose is producing a local artifact, the post-download state is unaddressed.

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 partially does: file_id's source (canvas_browse) and subdir's role as a path override are explained, and course appears as a path segment. However, it never clarifies whether 'course' is an ID or a name, leaving the highest-ambiguity parameter unresolved.

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?

States a specific verb+resource ('Download one Canvas file') and scopes it to a single file rather than a batch, which cleanly separates it from the list-oriented canvas_browse and the bulk canvas_sync. It also identifies the provenance of the required file_id, so an agent can place it in the workflow without opening the schema.

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 parenthetical that file_id comes 'from canvas_browse' implies the browse-then-download workflow, which is genuinely useful routing guidance. However, it never states when not to use this tool, nor does it distinguish itself from canvas_sync (bulk download) beyond the word 'one'. Usage is implied rather than explicit.

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

canvas_loginA

Sign in to Canvas. Opens a Chrome window on the user's computer at the university sign-in page; the user completes SSO + MFA there and the session is saved for the other tools. Tries a silent refresh first, so it often finishes without any window.

ParametersJSON Schema
NameRequiredDescriptionDefault
timeout_secondsNo

TDQS

A4.1/5.0
Behavior4/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 does well: it discloses that a Chrome window may open, that the user must complete SSO and MFA, that the session is saved, and that a silent refresh often avoids the window. It does not mention failure modes, timeout behavior, or exactly when the window will appear, leaving minor gaps for a login 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 two tight sentences with zero waste. The core purpose is front-loaded, followed by necessary operational detail. Every phrase earns its place without unnecessary repetition.

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 no annotations and no output schema, the description adequately covers the interactive login flow and session persistence. The only missing piece is any mention of the timeout parameter, which is the sole input and affects behavior. For a simple login tool, this is largely complete but not fully comprehensive.

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 single parameter 'timeout_seconds' has 0% schema description coverage, and the description does not mention it at all. The agent receives no guidance on what the timeout controls or how to set it, so the description fails to compensate for the missing schema documentation.

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 begins with a specific verb and resource: 'Sign in to Canvas.' It explains the mechanism and outcome, and makes clear this is an authentication prerequisite for other tools ('session is saved for the other tools'). No sibling tool covers login, so this 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 Guidelines4/5

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

The description provides clear context: it is the sign-in tool and its session benefits other tools. It also notes that it 'tries a silent refresh first,' implying it can be called even when a session may exist. However, it does not explicitly state when not to use it or name alternatives, which keeps it from a 5.

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

canvas_statusA

Check the Canvas session: which site, signed in as whom, and the download folder.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.5/5.0
Behavior3/5

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

With no annotations, the description must carry behavioral disclosure. 'Check' implies a non-mutating read, which is useful, and it discloses the information returned. However it says nothing about permissions, failure states (e.g., not signed in), or whether it has side effects.

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

Conciseness5/5

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

A single front-loaded sentence with no filler; the read target and the three returned facets are stated immediately.

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 status tool with no output schema, the description usefully enumerates the returned values, largely covering the missing output documentation. Only the authentication/failure context is absent.

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 nothing for the description to clarify; baseline applies. No misleading parameter claims are made.

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 ('Check') and resource ('Canvas session') and enumerates the exact facets returned: site, signed-in identity, and download folder. This distinguishes it in practice from canvas_sync_status, though it never names that sibling explicitly.

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

Usage 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 versus the many sibling tools (canvas_sync_status, canvas_login, canvas_courses). Usage is only weakly implied by the word 'Check', with no prerequisites or exclusions.

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

canvas_syncA

Download course files to /// (SlideMate's library if it's set up, else ~/CanvasFiles).

With a course (id, code or part of the name), downloads every file in it and returns the result. Without one, downloads the PDFs (lecture slides, handouts, readings) from every current course in the background and returns {"running": true}; call canvas_sync_status until it reports the result. Files already there are skipped.

ParametersJSON Schema
NameRequiredDescriptionDefault
courseNo
skip_existingNo

TDQS

A4.3/5.0
Behavior4/5

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

With no annotations, the description carries the behavioral burden and mostly does so: it discloses the on-disk target path, the SlideMate-vs-~/CanvasFiles fallback, the background-mode return value {"running": true}, and that existing files are skipped. It omits any authentication prerequisite (a canvas_login sibling exists) and gives no sense of volume or duration for the bulk mode.

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?

Front-loaded with the destination path, then the two modes, then the polling instruction. Three sentences, each earning its place, with no restatement of the tool name or padding.

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?

There is no output schema, but the description supplies the return contract for the async case ({"running": true}) and states the sync case 'returns the result'. For a two-parameter, no-annotation tool this is nearly complete; only the auth prerequisite and the shape of the eventual result are left unstated.

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 coverage is 0%, so the description must compensate and largely does: `course` is described as accepting an id, code, or partial name and as optional (the empty string drives the bulk mode), and the skip-existing behavior is surfaced. It never explains what skip_existing=false does or when a caller would want to override the default.

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

Purpose4/5

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

States a specific verb and resource ('Download course files') plus the exact destination layout and the two operating modes (single course vs. all current courses). It does not explicitly differentiate itself from the sibling canvas_download, which a reader must infer from the phrase 'downloads every file in it'.

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

Usage Guidelines5/5

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

Gives an explicit conditional: pass a `course` for a synchronous full download, omit it to fan out across all current courses in the background. It also names the follow-up tool (canvas_sync_status) and tells the agent to poll until a result appears, leaving nothing to inference about the async path.

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

canvas_sync_statusA

Progress of a sync started by canvas_sync without a course: {"running": true, "progress": …} while it runs, then the result (a summary, files per course and any errors).

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.1/5.0
Behavior4/5

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

With no annotations, the description carries the behavioral burden and does well: it discloses the running-state return shape and the final result contents, including summaries, per-course files, and errors. It omits polling interval or explicit read-only confirmation, but the status nature is evident.

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 compact sentence front-loads the tool's purpose and then describes the two output phases. The inline JSON example efficiently conveys the running-state shape without unnecessary prose.

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 status tool with no output schema and no annotations, the description explains both in-progress and completed returns adequately. It could add a note about polling until completion, but nothing essential for invoking it is missing.

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 has zero parameters, so there is no parameter semantics to document. Baseline 4 applies; the description does not need to add parameter details.

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 resource—progress/result of a sync—and ties it to the sibling canvas_sync without a course. It clearly distinguishes this status tool from the sync starter and from general status tools, though it does not explicitly contrast with canvas_status.

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 phrase 'started by canvas_sync without a course' gives clear context for when to use it: after starting a global sync. It does not spell out exclusions or name alternatives, but the intended usage is unambiguous.

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. 9 tool updatesv0.1.1
    • First observedcanvas_announcements
    • First observedcanvas_browse
    • First observedcanvas_courses
    • First observedcanvas_deadlines
    • First observedcanvas_download
    • First observedcanvas_login
    • First observedcanvas_status
    • First observedcanvas_sync
    • First observedcanvas_sync_status

TDQS

A4/5.0

Scored across 9 tools

Disambiguation4/5

Most tools have clearly distinct purposes (login, status, courses, browse, deadlines, announcements), and the bulk vs. single-file split between canvas_sync and canvas_download is clarified in the descriptions. The main risk is name-level confusion between canvas_status (session info) and canvas_sync_status (background sync progress), which share the word 'status' but differ in scope.

Naming Consistency5/5

All nine tools use a uniform canvas_ prefix with snake_case and largely verb/noun naming (canvas_login, canvas_courses, canvas_browse, canvas_download, canvas_deadlines). The only compound, canvas_sync_status, still fits the same pattern as the status companion to canvas_sync.

Tool Count5/5

Nine tools is a well-scoped set for a Canvas file/course access server. Each tool earns its place: authentication, session check, course listing, browsing, two download paths, plus deadlines and announcements.

Completeness4/5

The read/download lifecycle is well covered: auth, session status, courses, module browsing, bulk and single-file downloads, deadlines, and announcements. Gaps exist for grades, assignment submission, and messaging/discussion participation, though these may be outside the server's stated file-fetching focus.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers