A side-by-side look at the Canvas Lms MCP and StudioMeyer Academy MCP servers: transport, auth, tools, quality signals, and the config to install either one in Claude, Cursor, Windsurf or VS Code.
Verdict: choose Canvas Lms MCP for education work as a local process; choose StudioMeyer Academy for education as a local process. You can also run both side by side in one mcpServers block.
CANVAS_API_TOKEN, CANVAS_BASE_URL, CANVAS_PSEUDONYMIZE_STUDENTS.health_check, list_courses, get_course.academy_welcome, academy_levels, academy_lessons.Rows where the two servers differ are marked.
| Spec | ||
|---|---|---|
| Category | Education | Education |
| Quality signal | 67/100 · Great | 61/100 · Good |
| Install command | Confirmed | Confirmed |
| Transport | Local subprocess (stdio) | Local subprocess (stdio) |
| Auth | API key required | Not declared |
| Pricing | Free | Not declared |
| Required env vars | CANVAS_API_TOKENCANVAS_BASE_URLCANVAS_PSEUDONYMIZE_STUDENTS | None listed |
| Verified owner | Community listing | Community listing |
| GitHub stars | 10 | 1 |
| Directory activity | 2 views 0 installs 0 upvotes | 1 views 0 installs 0 upvotes |
| Tools | 174 | 12 |
| Full listing | View Canvas Lms MCP | View StudioMeyer Academy |
health_checkCheck if the Canvas API is reachable and the token is valid. Returns ok/error status.list_coursesList courses for the authenticated user. Use fields="slim" when enumerating courses for selection; switch to "full" once you have identified the target. slim returns id, name, course_code, term name, and workflow_state only. "full" (default) includes all Canvas fields plus `include` extras (teachers, total_students, syllabus_body, etc.). `state[]` narrows by course workflow state; `enrollment_state` narrows by the caller's enrollment state.get_courseGet details for a single course. Defaults to requesting `term` and `total_students`. Pass `include` to replace the default set with custom Canvas include[] fields (teachers, permissions, syllabus_body, sections, etc.).get_syllabusGet the syllabus HTML body for a course.create_courseCreate a new course in a Canvas account. Returns the created course object.update_courseUpdate an existing course. Only provided fields are changed; omitted fields are left as-is.list_assignmentsList all assignments in a course. Use fields="slim" when enumerating assignments for selection; switch to "full" once you've identified the target. slim returns id, name, due_at, points_possible, published, and course_id only. "full" (default) includes all Canvas fields plus `include` extras (submission, all_dates, overrides, score_statistics, etc.). Use `bucket` to filter by past/upcoming/overdue/etc. Other filters: `search_term`, `assignment_ids`, `order_by`.get_assignmentGet details for a single assignment by ID. Use `include` to request submission, overrides, all_dates, score_statistics, and other optional fields.list_assignment_groupsList assignment groups (categories like Homework, Exams) in a course. Use `include=assignments` to nest assignments under each group; other includes add submission, overrides, score_statistics, etc.create_assignmentCreate a new assignment in a course.update_assignmentUpdate an existing assignment in a course.delete_assignmentDelete an assignment from a course. This action is permanent.academy_welcomeALWAYS call this first when a user connects or asks what this is. Returns a short orientation for StudioMeyer Academy — a free 6-level 'Memory-First AI Operator' curriculum (Levels 1-3 fundamentals, 4-6 memory/MCP/multi-agent), plus playbooks and build recipes. Read it back to the user in their language and offer to start at their level.academy_levelsList the 6 curriculum levels with title, subtitle and lesson count. Use to show the user the learning path and ask where they want to start.academy_lessonsList all lessons in a level (titles, descriptions, duration). No body — call academy_lesson for the full text.academy_lessonGet the FULL text of one lesson. Teach it to the user: explain it in your own words, answer questions, give examples. This is how a user 'takes the course' with you as tutor.academy_playbooksList hands-on playbooks (short, practical how-tos for Claude Code, MCP, memory, agents). Optional category filter.academy_playbookGet the full text of one playbook by slug.academy_recipesList build recipes — step-by-step guides to build, deploy and ship real MCP servers and agent systems, organised by phase (1-16). Optional phase filter. Recipes are English-only (no locale parameter); lessons and playbooks exist in de/en/es.academy_recipeGet the full text of one build recipe by slug. English-only — recipes are not translated.academy_searchSearch the whole curriculum (lessons + playbooks + recipes) by keyword. Returns ranked matches with snippets and ids. Use when the user asks about a topic and you want the most relevant material.academy_tutor_contextGet a lesson packaged as a tutoring brief: the full lesson text plus its learning goals and the level context. Call this when the user wants to be *taught* a lesson — then YOU act as their tutor using this material (no Academy account needed, you are the tutor).searchSearch StudioMeyer Academy course material. Returns a list of matching lessons, playbooks and recipes with ids you can pass to `fetch`.fetchFetch the full text of one Academy item (lesson, playbook or recipe) by the id returned from `search`.Paste either block (or both) into your client config, e.g. claude_desktop_config.json or ~/.cursor/mcp.json. We only show a config when the install command is confirmed.
{
"mcpServers": {
"canvas-lms-mcp": {
"command": "npx",
"args": [
"-y",
"canvas-lms-mcp"
],
"env": {
"CANVAS_API_TOKEN": "YOUR_CANVAS_API_TOKEN_HERE",
"CANVAS_BASE_URL": "YOUR_CANVAS_BASE_URL_HERE",
"CANVAS_PSEUDONYMIZE_STUDENTS": "YOUR_CANVAS_PSEUDONYMIZE_STUDENTS_HERE"
}
}
}
}
{
"mcpServers": {
"studiomeyer-academy": {
"command": "npx",
"args": [
"-y",
"mcp-academy"
]
}
}
}