isu-moodle-mcp
isu-moodle-mcp
Ein MCP-Server, der Moodle an Claude anbindet. In zwei Ebenen aufgeteilt:
API-Ebene (18 Tools, das Rückgrat): Offizielle Web-Service-REST-API. Kein HTML-Scraping, kein Browser nötig.
CDP-Ebene (6 Tools, um Lücken zu schließen) + Altsystem-Ebene (4 Tools): Debug-Chrome nur dann, wenn die API wirklich nichts liefert. Das wichtigste Tool ist
probe_course_access()– es ist die einzige Möglichkeit herauszufinden, dass es einen Kurs gibt, den du nicht mehr sehen kannst.
Im Alltag reicht die API-Ebene völlig aus. Die CDP-Ebene ist für Fragen wie „Sind alle Kurse, die ich unterrichtet habe, in der Liste?" gedacht.
Für Workshop-Einheit 3 von „KI-Praxis im Kursdesign" der AIEA der I-Shou-Universität (2026-08-21). Einfach herunterladen und an deine eigenen Bedürfnisse anpassen – kein GitHub-Konto nötig.
Was das ist
Das im Unterricht demonstrierte flipclass-mcp ist der MCP-Server für FlipClass der Southern Taiwan University of Science and Technology. Dieses System hat keine API,
daher bezieht es seine Daten über zwei Wege: HTML-Scraping (32 XPath-Stellen) + Debug-Chrome (für Seiten wie die Notenmatrix oder Mitgliederlisten, die
reines HTTP nicht lesen kann). Das ist die Demonstration von „Egal wie geschlossen das System ist – mit Zugangsdaten kann man es vollständig reverse-engineeren."
Dieses Projekt ist die andere Hälfte derselben Sache: Wenn die Gegenseite eine API hat, kann derselbe MCP-Tool-Vertrag komplett auf ein anderes Backend umgestellt werden.
flipclass-mcp | moodle-mcp | |
Datenabruf | HTML-Scraping + lxml xpath | Offizielle REST-API |
Authentifizierung | Zugangsdaten + anticsrf-Token + Cookie-Cache | Ein Token, zustandslos |
Gegenseitiges Abmelden bei Mehrfachlogin | Ja (bekanntes Problem) | Nein |
Mitgliederlisten / Notenmatrix | Benötigt Debug-Chrome über CDP | In der normalen API enthalten |
Studenten-E-Mail | Wird aus der Matrikelnummer abgeleitet | Wird direkt in der Liste geliefert |
Authentifizierungsbezogener Code | ca. 247 Zeilen | ca. 15 Zeilen |
Debug-Chrome | Muss jedes Mal gestartet werden (ohne ihn keine Notenmatrix) | Nur bei Kursbeziehungsabfragen nötig |
Tool-Namen und Docstrings sind auf beiden Seiten bewusst identisch gehalten, sodass du direkt vergleichen kannst, wie dasselbe Bedürfnis in „mit API" und „ohne API" jeweils aussieht.
Related MCP server: Moodle MCP Server
Schnellstart
1. Code holen
git clone https://github.com/scatjay/isu-moodle-mcp.gitOhne Git kannst du auf der GitHub-Seite auch Code → Download ZIP wählen.
2. Abhängigkeiten installieren
pip install -r requirements.txtEs gibt nur zwei: requests und mcp.
3. Ein Token besorgen
python get_token.py https://moodle.你的學校.edu.twEs fragt nach deinen Moodle-Zugangsdaten und schreibt bei Erfolg das Token in .env.
Führe diesen Schritt in deinem eigenen Terminal aus, nicht in einem KI-Chat. Chat-Transkripte können gespeichert oder gesichert werden – sobald Passwort und Token darin auftauchen, sind sie praktisch geleakt.
Warum ein Token und nicht Zugangsdaten? Ein Token kann widerrufen werden, ist an deine eigenen Berechtigungen gebunden und führt nicht wie ein Passwort
bei einem Leak zum Totalverlust. Moodle-Tokens laufen standardmäßig nach 12 Wochen ab – wenn ein Tool mitten im Semester plötzlich ausfällt und
invalidtoken meldet, einfach dieses Skript erneut ausführen.
4. An Claude anbinden
In die Konfigurationsdatei von Claude Desktop (claude_desktop_config.json) eintragen:
{
"mcpServers": {
"moodle": {
"command": "python",
"args": ["C:/你的路徑/isu-moodle-mcp/server.py"],
"env": {
"MOODLE_URL": "https://moodle.你的學校.edu.tw",
"MOODLE_TOKEN": "貼上 .env 裡那一串",
"MOODLE_LEGACY_URL": "https://舊站網址(沒有舊站就整行刪掉)"
}
}
}
}5. Zuerst den Health-Check ausführen
Nach der Anbindung solltest du Claude als Erstes diagnose() ausführen lassen. Es zeigt dir, ob das Token gültig ist,
welche Funktionen du tatsächlich aufrufen kannst und was fehlt. Wenn etwas nicht funktioniert, ist das das erste Tool, das du ausführen solltest.
Verfügbare Tools
Tool | Funktion |
| Verbindungs-Check. Bei Problemen zuerst ausführen |
| Laufende Kurse |
| Alle noch sichtbaren Kurse (Achtung: bekannte Einschränkung unten) |
| Eigene Kurse per Stichwort finden |
| Wie viele Abschnitte, Materialien und Aufgaben ein Kurs hat |
| Materialliste (inkl. Download-URL) |
| Aufgabenliste |
| Abgabestatus der gesamten Klasse |
| Teilnehmerliste (Name / E-Mail / Rolle) |
| Notenmatrix: jeder Student × jede bewertete Aktivität |
| Aktivitätsabschluss |
| Kursmaterialien herunterladen |
| Beliebige Moodle-Funktion direkt aufrufen (zum Erkunden) |
| Abgabebericht: inkl. Abgabezeitpunkt, Verspätung, Anzahl der Neuabgaben |
| Einzelnoten eines bestimmten Studenten |
| E-Mail eines Studenten nachschlagen |
| Materialien + Aufgaben + Teilnehmerliste + Noten eines Kurses komplett herunterladen |
| Alle sichtbaren Kurse gesammelt abrufen |
CDP-Ebene (zuerst python start_debug_chrome_moodle.py ausführen und dich in diesem Fenster anmelden)
Tool | Funktion |
| Ist Debug-Chrome erreichbar, ist man angemeldet |
| Kann ich in diesen Kurs noch hinein? – die Frage, die die API nicht beantworten kann |
| Status, Methode, Einschreibungszeitpunkt, Gültigkeitszeitraum jeder Einschreibung |
| Scannt nach Kursen, die „existieren, aber für dich nicht mehr sichtbar" sind |
| Welcher Dienst welche Funktionen gebündelt hat, wer sich selbst Tokens holen kann |
| Capability-Matrix einer Rolle (300+ Einträge, über die API nicht abrufbar) |
Altsystem-Ebene (wenn die Hochschule die Plattform gewechselt hat)
Dafür muss in .env eine Zeile MOODLE_LEGACY_URL=https://alte-seite.de ergänzt werden.
Tool | Funktion |
| Ist die alte Seite aktiv, läuft sie über API oder CDP. Vor dem Datensammeln zuerst ausführen |
| Kurse, die auf dem Dashboard der alten Seite sichtbar sind |
| Altsystem-Version von „Kann ich in diesen Kurs noch hinein?" |
| Abschnitte und Materiallinks eines Kurses auf der alten Seite |
Diese Version enthält bewusst keinerlei Schreib-Tools (z. B. mod_assign_save_grade zum Ändern von Noten).
Bei reinen Leseoperationen ist ein Fehler höchstens falsche Daten; bei Schreiboperationen veränderst du wirklich die Noten von Studenten.
Falls du sie wirklich brauchst, füge sie selbst hinzu – aber übe zuerst auf einer Testinstanz.
Bekannte Einschränkungen (bitte diesen Abschnitt vollständig lesen)
🔴 Alte Kurse verschwinden still – aber unter engeren Bedingungen, als du denkst
core_enrol_get_users_courses gibt nur Kurse zurück, für die du aktuell noch eine Einschreibebeziehung hast.
Am 2026-08-20 mit zwei lokalen Moodle-4.1.18-Instanzen getestet, Punkt für Punkt verifiziert:
Was die Hochschule tut | Bleibt der Kurs in deiner Liste? |
Kurs auf versteckt setzen ( | Er bleibt sichtbar |
Kursenddatum ist überschritten | Er bleibt sichtbar |
Die Einschreibebeziehung des Lehrenden wird auf „deaktiviert" gesetzt | Er verschwindet. Und zwar ohne jede Fehlermeldung |
Diese Tabelle widerlegt eine weit verbreitete Annahme (auch in der vorherigen Version dieser README): „Versteckte oder archivierte alte Kurse verschwinden." Im Test nicht bestätigt. Was einen Kurs wirklich verschwinden lässt, ist nur die letzte Zeile. Das steht hier, weil eine durch Tests widerlegte Behauptung in der Dokumentation schlimmer ist als gar keine – du würdest danach vom Administrator die falschen Dinge verlangen.
Kurs, Studenten und Aufgaben sind weiterhin in der Datenbank vorhanden, nur du siehst sie nicht. Und die API sagt dir nicht „Es gibt einen Kurs, den du nicht mehr siehst" – sie erwähnt ihn einfach nicht.
Führe daher vor Langzeitanalysen zuerst find_hidden_courses() oder
probe_course_access(course_id) für einzelne Kurse aus und verlass dich nicht nur auf die Liste von list_history_courses().
Dieses Tool gibt immer ein caveat-Feld zurück, das dich daran erinnert – bitte ignoriere es nicht.
Moodle-Fehler kommen mit HTTP 200
Wenn Moodle einen Fehler zurückgibt, ist der HTTP-Statuscode trotzdem 200; der Fehler steckt im exception-Feld des Bodys.
raise_for_status() greift hier überhaupt nicht. Dieser Server behandelt das bereits, aber wenn du selbst Programme gegen Moodle schreibst, denk daran.
accessexception ist schwer zu diagnostizieren
Die offiziell gelisteten Ursachen umfassen sieben oder acht Varianten, und sofern der Administrator das Debugging nicht auf NORMAL oder höher stellt,
verrät die Fehlermeldung nicht, welche es ist. Dieser Server übersetzt es in verständliche Sprache und nennt die drei wahrscheinlichsten Ursachen,
aber um wirklich sicherzugehen, musst du diagnose() ausführen und sehen, welche Funktionen dein Token tatsächlich enthält.
Du siehst nur deine eigenen Kurse
Das ist eine eingebaute Garantie von Moodle, keine Einschränkung dieses Tools. Das Token erbt vollständig deine eigenen Berechtigungen, und jeder Aufruf führt eine Berechtigungsprüfung auf Kontextebene durch. Das ist gleichzeitig Sicherheitsgarantie und Einschränkung.
Array-Parameter funktionieren nicht mit JSON
Die Moodle-REST-API parst mit PHPs $_POST; Arrays müssen als courseids[0]=5&courseids[1]=7 geschrieben werden.
Ein JSON-String wird als einzelner String interpretiert und führt zu invalidparameter. Dieser Server flacht das automatisch ab.
Der Dateidownload-Parameter heißt anders
Der REST-Endpunkt verwendet wstoken, aber webservice/pluginfile.php verwendet token.
Das ist der Punkt, der beim Portieren am leichtesten übersehen wird. Außerdem muss der Dienst downloadfiles aktiviert haben.
Wenn get_token.py fehlschlägt
Fehler | Bedeutung | Lösung |
| Zugangsdaten falsch | Das Moodle-Konto ist nicht unbedingt deine E-Mail |
| Der Mobile-Webservice ist auf der Seite nicht aktiv | Administrator soll |
| Dein Konto hat keine Berechtigung, selbst Tokens zu erstellen | Die Schule hat die Standardberechtigungen geändert; Administrator muss ein Token ausstellen |
| Die Seite ist in Wartung | Später nochmal versuchen |
Moodle gibt standardmäßig moodle/webservice:createmobiletoken an alle angemeldeten Benutzer,
sodass Lehrende normalerweise ohne Administrator selbst ein Token erstellen können. Aber die Schule kann diesen Standardwert ändern –
wenn das passiert ist, merkst du es erst, wenn du tatsächlich ein Token erstellen willst; von außen ist das nicht erkennbar.
Entwicklungsnotizen
Dieses Projekt wurde von flipclass-mcp portiert. Beim Portieren wurde die schmerzhafteste Hälfte entfernt und die wertvollste Hälfte behalten:
Entfernt (ca. 247 Zeilen):
_login, anticsrf-Behandlung, Cookie-Cache,checkMultiLoginfür Mehrfachlogins, 32 lxml-XPath-Parser, CDP-Verbindung (Debug-Chrome)Behalten: FastMCP-Grundgerüst, Signatur und Docstring jedes
@mcp.tool()– das ist der eigentliche Wert, denn das ist der Vertrag, den das LLM sieht
Der Grund dafür: Keines der vorhandenen Python-Pakete für Moodle ist brauchbar: moodlepy ist seit fast zwei Jahren nicht mehr aktualisiert
und sperrt die Abhängigkeiten auf attrs<23 (Version von 2022); moodle_api.py ist seit drei Jahren veraltet und nicht auf PyPI;
python-moodle wird zwar gepflegt, scraped aber HTML statt ein REST-Client zu sein.
Die Moodle-REST-API ist so einfach, dass man sie in einem Dutzend Zeilen schreibt – ein veraltetes Paket einzubinden wäre nur zusätzliche technische Schuld.
Lizenz
MIT. Nimm es und passe es an die Version deiner eigenen Hochschule an – ohne zu fragen.
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables interaction with Moodle learning management systems through the Moodle REST API. Supports course management, user enrollment, assignments, forums, quizzes, and file operations through natural language.14MIT
- AlicenseNot gradedqualityDmaintenanceEnables interaction with Moodle learning management systems through the REST API. Supports course management, user enrollment, assignment handling, and forum operations through natural language.14MIT
- AlicenseNot gradedqualityCmaintenanceProvides Claude with full access to Moodle learning management systems, enabling interaction with courses, files, assignments, grades, and calendar events. It also supports building Obsidian study vaults from course materials through automated knowledge graph creation.1416MIT
- FlicenseAqualityCmaintenanceEnables read-only querying of Moodle as a student, including courses, assignments, grades, forums, and files, using a personal web services token.11
Related MCP Connectors
Read-only MCP server for ClassQuill, a tutoring-business-management platform.
WHOOP recovery, strain, sleep and workouts in Claude via official WHOOP OAuth. Free, open source.
Read-only tools over the Safer Agentic AI framework: 238 patterns + 14 heuristics.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/scatjay/isu-moodle-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server