isu-moodle-mcp
isu-moodle-mcp
MCP-сервер для подключения Moodle к Claude. Разделён на два уровня:
Уровень API (18 инструментов, основной): официальный REST API веб-сервисов. Без парсинга HTML, без открытия браузера.
Уровень CDP (6 инструментов, для закрытых дыр) + уровень старой системы (4 инструмента): debug Chrome используется только тогда, когда API действительно не может получить данные. Самый важный инструмент —
probe_course_access()— это единственный способ обнаружить «курс, который ты больше не видишь».
Обычно достаточно только уровня API. Уровень CDP предназначен для вопросов вроде «все ли курсы, которые я вёл, есть в списке?».
Для семинара «Практика ИИ в проектировании курсов» (AIEA) Университета И-Шоу (2026-08-21), модуль 3. Просто склонируйте и адаптируйте под себя — аккаунт GitHub не нужен.
Что это такое
Продемонстрированный на занятии flipclass-mcp — это MCP-сервер для FlipClass Университета Южного Тайваня. У той системы нет API,
поэтому она получает данные двумя способами: парсинг HTML (32 xpath) + debug Chrome (матрица оценок, списки участников и другие
страницы, которые нельзя прочитать через чистый HTTP). Это демонстрация того, что «даже если система закрыта, имея логин и пароль, можно полностью восстановить её работу».
Этот набор — вторая половина той же задачи: когда у системы есть API, тот же контракт инструментов MCP можно полностью переключить на другой бэкенд.
flipclass-mcp | moodle-mcp | |
Получение данных | парсинг HTML + lxml xpath | официальный REST API |
Аутентификация | логин/пароль + anticsrf token + кэш cookie | один токен, без состояния |
Взаимное вытеснение при множественных входах | есть (известная проблема) | нет |
Список участников / матрица оценок | нужно открывать debug Chrome через CDP | есть в обычном API |
Email студентов | выводится из номера студента | выдаётся прямо в списке |
Код аутентификации | около 247 строк | около 15 строк |
debug Chrome | нужно открывать каждый раз (без него нет матрицы оценок) | нужен только при проверке связей записи на курсы |
Названия инструментов и docstring намеренно совпадают в обоих проектах, чтобы можно было напрямую сравнивать, как одна и та же задача выглядит в случае «с API» и «без API».
Related MCP server: Moodle MCP Server
Быстрый старт
1. Получить код
git clone https://github.com/scatjay/isu-moodle-mcp.gitЕсли нет git, на странице GitHub можно нажать Code → Download ZIP.
2. Установить зависимости
pip install -r requirements.txtИх всего две: requests и mcp.
3. Заменить токен
python get_token.py https://moodle.你的學校.edu.twОн спросит логин и пароль от Moodle, и при успехе запишет токен в .env.
Запускайте этот шаг в своём собственном терминале, а не в диалоге с ИИ. Транскрипты диалогов могут сохраняться или резервироваться; если пароль и токен окажутся там — это утечка.
Почему токен, а не логин/пароль? Токен можно отозвать, он привязан только к вашим правам и не приводит к полной компрометации при утечке,
в отличие от пароля. Токен Moodle по умолчанию истекает через 12 недель — если инструмент внезапно сломался посреди семестра и выдаёт
invalidtoken, просто запустите этот скрипт заново.
4. Подключить к Claude
В файл настроек Claude Desktop (claude_desktop_config.json) добавьте:
{
"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. Сначала запустите диагностику
После подключения первой командой попросите Claude запустить diagnose(). Он сообщит, действителен ли токен,
какие функции вам реально доступны и чего не хватает. Если что-то не подключается — первым делом запускайте именно его.
Какие есть инструменты
Tool | Что делает |
| Диагностика подключения. Если не подключается — запускайте первым |
| Текущие курсы |
| Все курсы, которые ещё видны (обратите внимание на известные ограничения ниже) |
| Поиск своих курсов по ключевому слову |
| Сколько в курсе модулей, материалов, заданий |
| Список материалов (включая ссылки для скачивания) |
| Список заданий |
| Статус сдачи всей группы |
| Список записавшихся (имя / email / роль) |
| Матрица оценок: каждый студент × каждый оцениваемый элемент |
| Степень завершения активности |
| Скачать файл материала |
| Прямой вызов любой функции Moodle (для исследования) |
| Отчёт о сдаче: время сдачи, опоздания, количество повторных сдач |
| Поэлементные оценки одного студента |
| Найти email студента |
| Скачать весь пакет курса: материалы + задания + список + оценки |
| Скачать пакет всех видимых курсов |
Уровень CDP (сначала запустите python start_debug_chrome_moodle.py и войдите в том окне)
Tool | Что делает |
| Работает ли debug Chrome, выполнен ли вход |
| Могу ли я ещё войти в этот курс — вопрос, на который API ответить не может |
| Статус, метод, время записи, даты начала и окончания для каждой записи |
| Сканирование и поиск курсов, которые «существуют, но ты их больше не видишь» |
| Какие функции привязаны к каким сервисам, кто может сам получить токен |
| Матрица capability роли (300+ записей, через API недоступна) |
Уровень старой системы (когда школа сменила платформу)
Нужно добавить в .env строку MOODLE_LEGACY_URL=https://адрес-старого-сайта.
Tool | Что делает |
| Жив ли старый сайт, работает через API или CDP. Запускайте перед извлечением данных |
| Курсы, видимые на панели старого сайта |
| Версия «могу ли я ещё войти в этот курс» для старого сайта |
| Модули и ссылки на материалы курса на старом сайте |
В этой версии намеренно нет ни одного инструмента записи (например, mod_assign_save_grade для изменения оценок).
Ошибка в read-only инструменте — максимум неверные данные; ошибка в записи — это реальное изменение оценок студентов.
Если действительно нужно — добавьте сами, но сначала потренируйтесь на тестовом сайте.
Известные ограничения (обязательно прочитайте этот раздел)
🔴 Старые курсы тихо исчезают — но условия уже, чем вы думаете
core_enrol_get_users_courses возвращает только курсы, на которые у вас сейчас есть активная запись.
Проверено 2026-08-20 на двух локальных Moodle 4.1.18, каждый пункт протестирован:
Что сделала школа | Курс всё ещё в вашем списке? |
Курс скрыт ( | Всё ещё виден |
Дата окончания курса уже прошла | Всё ещё виден |
Запись преподавателя переведена в статус «отключена» | Исчезает. И без единой ошибки |
Эта таблица опровергает очень распространённое утверждение (включая предыдущую версию этого README): «скрытие или архивирование старых курсов заставляет их исчезать». Проверка показала, что это не так. Реально курс исчезает только в последней строке таблицы. Это написано здесь потому, что опровергнутое проверкой утверждение, оставленное в документации, хуже, чем его отсутствие — вы будете действовать по нему и просить у администратора не то.
Курс, студенты и задания остаются в базе данных, просто вы их не видите. А API не сообщает вам «есть курс, который ты больше не видишь» — он просто об этом умалчивает.
Поэтому перед длительным анализом сначала запустите find_hidden_courses() или
probe_course_access(course_id) для проверки каждого курса, не полагайтесь только на список из list_history_courses().
Этот инструмент всегда возвращает поле caveat с предупреждением — пожалуйста, не игнорируйте его.
Ошибки Moodle приходят с HTTP 200
Когда Moodle возвращает ошибку, HTTP-статус всё равно 200, ошибка спрятана в поле exception в теле ответа.
raise_for_status() её вообще не поймает. Этот сервер уже обрабатывает это, но если вы пишете свой код для работы с Moodle — помните об этом.
accessexception трудно диагностировать
В официальной документации перечислено семь-восемь возможных причин, и если администратор не включил отладку выше уровня NORMAL,
сообщение об ошибке не укажет, какая именно причина. Этот сервер переводит её на человеческий язык и даёт три наиболее вероятные причины,
но чтобы точно определить, какая из них, всё равно нужно запустить diagnose() и посмотреть, какие функции реально содержит ваш токен.
Вы видите только свои курсы
Это встроенная гарантия Moodle, а не ограничение этого инструмента. Токен полностью наследует права вашей учётной записи, при каждом вызове выполняется проверка прав на уровне контекста. Это одновременно и гарантия безопасности, и ограничение.
Параметры-массивы нельзя передавать в JSON
Moodle REST использует PHP-парсинг $_POST, массивы нужно записывать как courseids[0]=5&courseids[1]=7.
Если передать JSON-строку, она будет воспринята как одна строка и вызовет ошибку invalidparameter. Этот сервер автоматически разворачивает массивы.
Имя параметра для скачивания файлов другое
REST-эндпоинт использует wstoken, а webservice/pluginfile.php — token.
Это легче всего упустить при переносе. Кроме того, у сервиса должна быть включена опция downloadfiles.
Если get_token.py не работает
Ошибка | Значение | Что делать |
| Неверный логин/пароль | Логин Moodle не обязательно равен вашему email |
| На сайте не включён сервис мобильных устройств | Попросите администратора включить |
| У вашей учётной записи нет прав на создание токена | Школа изменила права по умолчанию, нужно попросить администратора выдать токен |
| Сайт на техническом обслуживании | Подождите и попробуйте снова |
По умолчанию Moodle выдаёт право moodle/webservice:createmobiletoken всем вошедшим пользователям,
поэтому преподавателю обычно не нужен администратор, чтобы самостоятельно сменить токен. Но школа может изменить это значение по умолчанию —
если изменила, вы узнаете об этом только когда реально попробуете сменить токен, снаружи это не обнаружить.
Заметки для разработчиков
Этот проект перенесён из flipclass-mcp. При переносе была вырезана самая болезненная половина и оставлена самая ценная:
Вырезано (около 247 строк):
_login, обработка anticsrf, кэш cookie, обработка множественных входовcheckMultiLogin, 32 места парсинга lxml xpath, подключение CDP (debug Chrome)Сохранено: каркас FastMCP, сигнатуры и docstring каждого
@mcp.tool()——вот это и есть настоящий актив, потому что это контракт, который видит LLM
Так сделано потому, что ни один готовый Python-пакет для Moodle не подошёл: moodlepy не обновлялся почти два года
и жёстко привязан к attrs<23 (версия 2022 года); moodle_api.py не обновлялся три года и отсутствует в PyPI;
python-moodle ещё поддерживается, но по сути парсит HTML, а не является REST-клиентом.
REST Moodle настолько прост, что пишется за десять-пятнадцать строк, а подключение устаревшего пакета — это просто лишний технический долг.
Лицензия
MIT. Берите и адаптируйте под свою школу, спрашивать разрешения не нужно.
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