Moodle MCP for Swiss universities
Use your university's Moodle from Claude: courses, materials, downloads, deadlines and announcements. Works with ZHAW, FHNW, ETH, EPFL and the other Swiss universities below, and with any other Moodle 4 site. You log in yourself (usually with SWITCH edu-ID) — your password is never seen or stored, and everything stays on your computer.
Unofficial student project, not affiliated with any university. Course material is for personal study only.
Formerly zhaw-moodle-mcp. Existing setups keep working: uvx zhaw-moodle-mcp now installs this
package, and your login and settings stay where they are. For the Claude Desktop extension,
install the new swiss-moodle-<version>.mcpb over the old one.
Quick start
Claude Desktop (recommended)
- Download
swiss-moodle-<version>.mcpbfrom the latest release. - Double-click it, or in Claude Desktop open Settings → Extensions → Advanced settings → Install Extension… and pick the file. Click Install.
- Enter your university under University: its short name from the table below (e.g.
fhnw) or the web address of your Moodle. You can also leave it empty and simply tell Claude in the chat which university you study at. - Open a new chat and ask "Which Moodle courses do I have?". The first start takes a few seconds; then a browser opens for the login.
To switch universities later, change University in the extension's settings (or, if you left it empty, ask Claude to switch). In the chat's + → prompts menu you find ready-made study sessions: study assistant, last lecture summary, deadlines overview, what's new, exam preparation.
Claude Code
Install uv, then (with your university's short name):
claude mcp add moodle -e MOODLE_MCP_INSTITUTION=fhnw -- uvx swiss-moodle-mcp@latest
Ask Claude
"Summarise the last lecture of Software Engineering 1", "Show all my deadlines as a table",
"Sync all my courses", "What's new since Monday?". Files go to a folder named after your
university in your home directory (e.g. ~/FHNW).
Universities
| University | Short name | Moodle | Status |
|---|---|---|---|
| ZHAW | zhaw |
moodle.zhaw.ch | tested |
| BFH | bfh |
moodle.bfh.ch | not tested yet |
| EPFL | epfl |
moodle.epfl.ch | not tested yet |
| ETH | ethz |
moodle-app2.let.ethz.ch | not tested yet |
| FFHS | ffhs |
moodle.ffhs.ch | not tested yet |
| FHGR | fhgr |
moodle.fhgr.ch | not tested yet |
| FHNW | fhnw |
moodle.fhnw.ch | not tested yet |
| HES-SO | hes-so |
cyberlearn.hes-so.ch | not tested yet |
| HFTM | hftm |
moodle.hftm.ch | not tested yet |
| OST | ost |
moodle.ost.ch | not tested yet |
| PHLU | phlu |
moodle.phlu.ch | not tested yet |
| UNIFR | unifr |
moodle.unifr.ch | not tested yet |
| UNIGE | unige |
moodle.unige.ch | not tested yet |
| UNIL | unil |
moodle.unil.ch | not tested yet |
| UNINE | unine |
moodle.unine.ch | not tested yet |
| USI | usi |
www.icorsi.ch | not tested yet |
| SUPSI | supsi |
www.icorsi.ch | not tested yet |
"Not tested yet": the site runs Moodle 4, but nobody has used this server there
yet. It should work - you can help by running uvx swiss-moodle-mcp doctor, which tries every
feature on one of your courses and prints a report without course names or personal data, and
posting it as a compatibility report.
Not listed? Use the address of your Moodle instead of a short name (copy it from the browser while you are on your Moodle). The Moodle must be version 4.0 or newer; other learning platforms (ILIAS, OLAT, Canvas) are not supported.
Good to know
- Browser: login uses your default browser if it is Chrome, Edge, Brave or Vivaldi, otherwise another installed one (Firefox and Safari are not supported).
- Updates: the extension is updated by installing a newer
.mcpb; withuvx ...@latest(Claude Code) updates install automatically when Claude starts. - Extension does not start: it runs with uv. If Claude Desktop
reports that
uvis missing, install uv and restart Claude completely (also from the tray). - Sync never deletes local files. Logging out (ask Claude, or
uvx swiss-moodle-mcp logout) removes the stored session and the login browser profile; a running server notices it. - Session and settings live in
~/.swiss-moodle-mcpon Windows (outside AppData, so Claude from the Microsoft Store and the command line share them) and in the usual app folders on macOS/Linux, with a separateinstances/<moodle host>folder per Moodle site. Folders namedzhaw-moodle-mcpfrom older versions keep being used.
Configuration
Choose your university once with uvx swiss-moodle-mcp setup (a list to pick from, or
setup fhnw, or setup <address of your Moodle>); uvx swiss-moodle-mcp universities lists the
known ones and uvx swiss-moodle-mcp status shows what is set. You can also just tell Claude your
university ("I study at FHNW"); it stores the choice for you. If you used this server before
v0.5, ZHAW stays selected.
The extension asks for the university, download folder and browser in its settings. Otherwise
run uvx swiss-moodle-mcp config-path to see where config.toml goes:
[moodle]
institution = "zhaw" # or bfh, epfl, ethz, ffhs, fhgr, fhnw, hes-so, hftm, ost, phlu, unifr,
# unige, unil, unine, usi, supsi - or the address of any other Moodle
# download_directory = "~/Studium/{short}" # default ~/ZHAW, ~/FHNW, ...
[browser]
name = "auto" # or "chrome", "msedge", "brave", "vivaldi"
# executable_path = "C:/path/to/browser.exe" # any other Chromium-based browser
Development
uv sync
uv run pytest
uv run ruff check .
In this folder Claude Code picks up the server from .mcp.json, plus a
study assistant subagent (copy it to ~/.claude/agents/ to use it
everywhere). Build the Claude Desktop extension with uv run python scripts/build_extension.py (needs Node.js).
Pushing a vX.Y.Z tag that matches pyproject.toml publishes to PyPI and attaches the .mcpb
to a GitHub release.
Release files for swiss-moodle-mcp 0.5.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| swiss_moodle_mcp-0.5.0.tar.gz | 67.6 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| swiss_moodle_mcp-0.5.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 156.0 kB
Release files / swiss_moodle_mcp-0.5.0.tar.gz
| Download URL | swiss_moodle_mcp-0.5.0.tar.gz |
|---|---|
| Size | 67.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
e74c201cf9b9e01f61def219bd9b15f9d9461b015a5315612707e4296294510b
|
|
BLAKE2b-256 checksum How to use checksums |
5a2ed6ac0d78c759a0142e0bf471ba82816a3daf0d0137976e1c5211ac578ee3
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 29, 2026.
Transparency logRelease files / swiss_moodle_mcp-0.5.0-py3-none-any.whl
| Download URL | swiss_moodle_mcp-0.5.0-py3-none-any.whl |
|---|---|
| Size | 88.5 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
7d8ee635dab981d02465f6387c502465ccbd66466f2e2e81e4f5d708ddb92f52
|
|
BLAKE2b-256 checksum How to use checksums |
814a5532c6dad8c4aaa0f8745d5477c1435c2ef1726cc780b2b5d40a69cf4226
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 29, 2026.
Transparency log