Canvas Lms MCP vs Zh Education MCP

A side-by-side look at the Canvas Lms MCP and Zh Education MCP MCP servers: transport, auth, tools, quality signals, and the config to install either one in Claude, Cursor, Windsurf or VS Code.

Canvas Lms MCP logoCanvas Lms MCPEducation · Local subprocess (stdio)TypeScript MCP server for Canvas LMS — 115 read+write tools across 17 domains.67GreatAuth: api key requiredZh Education MCP logoZh Education MCPEducation · Local subprocess (stdio)Canton and City of Zurich education data: schools, statistics, infrastructure57GoodAuth: not declared

Verdict: choose Canvas Lms MCP for education work as a local process; choose Zh Education MCP for education as a local process. You can also run both side by side in one mcpServers block.

Which MCP server should you choose?

Canvas Lms MCP logoChoose Canvas Lms MCP when

  • You need dedicated capabilities in the Education domain.
  • You prefer a local stdio subprocess transport.
  • Its auth model fits you: API key required.
  • You have the keys it needs: CANVAS_API_TOKEN, CANVAS_BASE_URL, CANVAS_PSEUDONYMIZE_STUDENTS.
  • You want tools like health_check, list_courses, get_course.
Explore Canvas Lms MCP

Zh Education MCP logoChoose Zh Education MCP when

  • You need dedicated capabilities in the Education domain.
  • You prefer a local stdio subprocess transport.
  • You want tools like zh_edu_list_schulgemeinden, zh_edu_schulkreis_trend, zh_edu_overview.
Explore Zh Education MCP

Feature & specification comparison

Rows where the two servers differ are marked.

SpecCanvas Lms MCP logoCanvas Lms MCPZh Education MCP logoZh Education MCP
CategoryEducationEducation
Quality signal67/100 · Great57/100 · Good
Install commandConfirmedConfirmed
TransportLocal subprocess (stdio)Local subprocess (stdio)
AuthAPI key requiredNot declared
PricingFreeNot declared
Required env varsCANVAS_API_TOKENCANVAS_BASE_URLCANVAS_PSEUDONYMIZE_STUDENTSNone listed
Verified ownerCommunity listingCommunity listing
GitHub stars100
Directory activity 2 views 0 installs 0 upvotes 1 views 0 installs 0 upvotes
Tools1748

Tools & capabilities

Canvas Lms MCP tools 174

  • 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.
  • +162 more on the listing page

Zh Education MCP tools 8

  • zh_edu_list_schulgemeindenListet alle Schulgemeinden und Schulkreise im Kanton Zürich auf. Extrahiert die eindeutigen Schulgemeinden aus den Sekundarstufe-I-Daten. Nützlich als Einstieg, um gültige Namen für andere Tools zu finden. Args: params (ListSchulgemeindensInput): - suchbegriff (str | None): Filter nach Teilstring (z. B. 'Zürich') - response_format: 'markdown' oder 'json' Returns: str: Alphabetische Liste aller Schulgemeinden.
  • zh_edu_schulkreis_trendZeigt den Lernenden-Trend für eine Schulgemeinde / einen Schulkreis. Liefert die Entwicklung der Lernendenzahlen (Sek I) über die letzten N Jahre, aufgeschlüsselt nach Anforderungstyp (Sek A, Sek B, Sek C etc.). Args: params (SchulkreisTrendInput): - schulgemeinde (str): Name der Schulgemeinde (z. B. 'Zürich-Letzi') - letzte_n_jahre (int): Anzahl Jahre rückwärts (Standard: 5) - response_format: 'markdown' oder 'json' Returns: str: Trend-Übersicht mit Jahresvergleich und Gesamtentwicklung.
  • zh_edu_overviewGibt eine kantonsweite Übersicht aller Lernenden nach Stufe, Typ und Geschlecht. Datenquelle: BISTA-Übersicht aller Lernenden im Kanton Zürich. Umfasst Primarstufe, Sekundarstufe I, Sekundarstufe II und Tertiärstufe. Args: params (UebersichtInput): - jahr (int | None): Bestimmtes Jahr (leer = aktuellstes) - stufe (str | None): Filter nach Schulstufe - response_format: 'markdown' oder 'json' Returns: str: Übersichtstabelle mit Lernenden nach Stufe und Schultyp.
  • zh_edu_sek1_profilZeigt das Sek-I-Profil einer Schulgemeinde (Anforderungstypen A/B/C). Schlüsselt die Lernenden der Sekundarstufe I nach Anforderungstyp auf: Sek A (höchste Anforderungen), Sek B, Sek C, Mittelschule, Sonderklassen. Args: params (Sek1ProfilInput): - schulgemeinde (str): Schulgemeinde (z. B. 'Zürich-Letzi') - jahr (int | None): Bestimmtes Jahr (leer = aktuellstes) - response_format: 'markdown' oder 'json' Returns: str: Profil mit Anzahl und Anteil pro Anforderungstyp.
  • zh_edu_staatsangehoerigkeitenZeigt die Staatsangehörigkeitsstruktur der Lernenden einer Schulgemeinde. Liefert die häufigsten Nationalitäten der Schüler·innen in einer Schulgemeinde, inkl. ISO2-Ländercode und Anteil. Args: params (StaatsangehoerigkeitInput): - schulgemeinde (str): Schulgemeinde (z. B. 'Zürich-Letzi') - top_n (int): Anzahl Top-Nationalitäten (Standard: 10) - jahr (int | None): Bestimmtes Jahr (leer = aktuellstes) - response_format: 'markdown' oder 'json' Returns: str: Rangliste der häufigsten Nationalitäten mit Anteil.
  • zh_edu_maturitaetsquoteZeigt die gymnasiale Maturitätsquote nach Gemeinde, Bezirk und Kanton. Die Maturitätsquote berechnet sich als Anteil der gymnasialen Abschlüsse an der 19-jährigen Wohnbevölkerung einer Gemeinde. Args: params (MaturitaetsquoteInput): - gemeinde (str | None): Gemeindename filtern - bezirk (str | None): Bezirk filtern - response_format: 'markdown' oder 'json' Returns: str: Maturitätsquoten-Tabelle mit Abschlüssen und Quote pro Gemeinde.
  • zh_edu_wohnort_trendZeigt die Entwicklung der Lernendenzahlen nach Wohnort (Bezirk/Gemeinde). Basiert auf dem Wohnort der Lernenden, nicht dem Schulort. Aufschlüsselung nach Gebietstyp (Kanton, Bezirk, Gemeinde) und Schulstufe. Args: params (WohnortTrendInput): - gebiet (str | None): Gebietsbezeichnung filtern - stufe (str | None): Schulstufe filtern - letzte_n_jahre (int): Anzahl Jahre (Standard: 5) - response_format: 'markdown' oder 'json' Returns: str: Trend-Tabelle der Lernenden nach Wohnort und Stufe.
  • zh_edu_mittelschulenZeigt Statistiken zu Mittelschulen (Gymnasium, FMS, HMS) im Kanton Zürich. Umfasst Lernendenzahlen nach Mittelschultyp, Bildungsart, Geschlecht und Staatsangehörigkeit. Args: params (MittelschulenInput): - mittelschultyp (str | None): Schultyp filtern (z. B. 'Gymnasium') - jahr (int | None): Bestimmtes Jahr (leer = aktuellstes) - response_format: 'markdown' oder 'json' Returns: str: Mittelschulstatistiken nach Typ und Bildungsart.

Ready-to-paste client configs

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.

Canvas Lms MCP

mcpServers (Claude Desktop / Cursor)
{
  "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"
      }
    }
  }
}

Zh Education MCP

mcpServers (Claude Desktop / Cursor)
{
  "mcpServers": {
    "zh-education-mcp": {
      "command": "uvx",
      "args": [
        "zh-education-mcp"
      ]
    }
  }
}

Frequently asked questions

Canvas Lms MCP is categorized under Education and uses a local stdio subprocess. Zh Education MCP belongs to Education and uses a local stdio subprocess. Pick Canvas Lms MCP for education work and Zh Education MCP for education.

Copy the mcpServers block from the config section on this page into your client's config (for example claude_desktop_config.json or ~/.cursor/mcp.json), then fully restart the client.

Canvas Lms MCP is listed as free. Auth: api key required. Zh Education MCP has no declared pricing — check the project's own site. If a server needs environment variables such as API keys, define them under the env key in your client's MCP config.

Yes. MCP clients support multiple servers: add canvas-lms-mcp and zh-education-mcp as separate keys in the same mcpServers object, and your assistant will call tools from either one.

On AllMCPs, Canvas Lms MCP has a quality signal of 67/100 (Great) with 2 views, 0 installs and 10 GitHub stars. Zh Education MCP has 57/100 (Good) with 1 views, 0 installs and 0 GitHub stars.