Metadata-Version: 2.4
Name: swiss-moodle-mcp
Version: 0.5.0
Summary: MCP server for the Moodle of Swiss universities (ZHAW, FHNW, ETH, EPFL, ...): courses, learning materials, downloads and sync via browser login (SWITCH edu-ID)
Keywords: mcp,moodle,zhaw,fhnw,eth,epfl,switch-edu-id,claude,model-context-protocol
Author: Dathis
Author-email: Dathis <danilvolodimirovich@gmail.com>
License-Expression: MIT
License-File: LICENSE
Classifier: Development Status :: 4 - Beta
Classifier: Environment :: Console
Classifier: Intended Audience :: Education
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Topic :: Education
Requires-Dist: beautifulsoup4>=4.15.0
Requires-Dist: httpx>=0.28.1
Requires-Dist: lxml>=6.1.3
Requires-Dist: mcp>=2.2.0
Requires-Dist: platformdirs>=4.11.8
Requires-Dist: playwright>=1.63.0
Requires-Dist: pypdf>=6.19.0
Requires-Dist: python-docx>=1.2.0
Requires-Dist: python-pptx>=1.0.2
Requires-Dist: tzdata>=2026.4
Requires-Python: >=3.11
Project-URL: Homepage, https://github.com/Dathis/swiss-moodle-mcp
Project-URL: Issues, https://github.com/Dathis/swiss-moodle-mcp/issues
Description-Content-Type: text/markdown

# Moodle MCP for Swiss universities

[![PyPI](https://img.shields.io/pypi/v/swiss-moodle-mcp)](https://pypi.org/project/swiss-moodle-mcp/)
[![CI](https://github.com/Dathis/swiss-moodle-mcp/actions/workflows/ci.yml/badge.svg)](https://github.com/Dathis/swiss-moodle-mcp/actions/workflows/ci.yml)
[![License: MIT](https://img.shields.io/badge/license-MIT-blue)](https://github.com/Dathis/swiss-moodle-mcp/blob/main/LICENSE)

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)

1. Download `swiss-moodle-<version>.mcpb` from the
   [latest release](https://github.com/Dathis/swiss-moodle-mcp/releases/latest).
2. Double-click it, or in Claude Desktop open **Settings → Extensions → Advanced settings →
   Install Extension…** and pick the file. Click **Install**.
3. 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.
4. 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](https://docs.astral.sh/uv/), then (with your university's short name):

```bash
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](https://github.com/Dathis/swiss-moodle-mcp/issues/new?template=university-report.yml).

**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`; with `uvx ...@latest`
  (Claude Code) updates install automatically when Claude starts.
- **Extension does not start:** it runs with [uv](https://docs.astral.sh/uv/). If Claude Desktop
  reports that `uv` is 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-mcp` on 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 separate `instances/<moodle host>` folder per Moodle site. Folders named
  `zhaw-moodle-mcp` from 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:

```toml
[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

```bash
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](https://github.com/Dathis/swiss-moodle-mcp/blob/main/.claude/agents/study-assistant.md) 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.
