EduPage MCP Server
Проект
MCP-сервер Model Context Protocol (MCP), который предоставляет AI-агентам, таким как opencode, Claude, Cursor и другим MCP-клиентам, полный набор возможностей библиотеки Python edupage-api.
EduPage — школьная информационная система, используемая по всей Европе. Этот сервер позволяет напрямую запрашивать данные и выполнять действия в учётной записи ученика, учителя или родителя EduPage через агента: просматривать расписание, оценки, домашние задания, замены, информацию о питании (в том числе заказывать блюда), сообщения и списки учащихся, переключаться между учётными записями родителя и ребёнка и многое другое. Поддерживается работа с несколькими школами — например, если двое детей учатся в разных школах.
⚠️ Неофициальный API. Как и другие MCP-серверы EduPage, этот проект использует библиотеку edupage-api, которую поддерживает сообщество. Библиотека взаимодействует с недокументированными конечными точками EduPage. Функции только для чтения можно использовать свободно. К функциям, изменяющим данные (
send_message, заказ питания, переключение между учётными записями детей), следует относиться осторожно.
Содержание
-
Почему появился ещё один MCP-сервер EduPage?
-
Возможности
-
Начало работы
-
Требования
-
- Установка
-
- Настройка учётных данных
-
- Регистрация в MCP-клиенте
-
-
Примеры запросов
-
Несколько школ (субдомены)
-
Справочник инструментов
-
Данные и безопасность
-
Участие в разработке
-
Ограничения
-
Поддержка
-
Лицензия
Почему появился ещё один MCP-сервер EduPage?
Уже существуют два других MCP-сервера EduPage:
- mrtineu/edupage-mcp — также
опубликован в PyPI под именем edupage-mcp
Оба проекта достойны внимания. Я не связан с их авторами — они упомянуты здесь исключительно для объективного сравнения. В основном эти серверы ориентированы на чтение данных через API.
Этот проект намеренно предлагает больше возможностей:
| Возможность | mhlavac | mrtineu (PyPI) | этот проект |
|---|---|---|---|
Расширенный вход — автоматическое определение портала, 2FA, идентификатор сессии (PHPSESSID) | частично (портал) | только базовый вход | ✅ |
| Расписание (собственное, а также любого учителя, класса или кабинета) | ✅ | ✅ | ✅ |
| Оценки (все, по учебному периоду и году) | ✅ | ✅ | ✅ |
| Замены и изменения в расписании | ✅ | ✅ | ✅ |
| Питание — просмотр меню | ✅ | ✅ | ✅ |
| Питание — выбор блюда, отказ от заказа, оценка | ❌ | ❌ | ✅ |
Отправка сообщений (send_message) | ✅ | ❌ | ✅ |
| Переключение родителя на учётную запись ученика и обратно | частично (список) | ❌ | ✅ |
| Время следующего звонка и расписание звонков | ❌ | ❌ | ✅ |
| Пользовательский запрос через текущую сессию | ❌ | ❌ | ✅ |
| Несколько школ (автоматический вход и поиск) | ❌ | ❌ | ✅ |
| Учёт роли (родитель, ученик, учитель) | ❌ | ❌ | ✅ |
| Сводки за день (ежедневный отчёт одним вызовом) | ❌ | ❌ | ✅ |
| Домашние задания — текст и вложения | ❌ | ✅ | ✅ |
| Скачивание файла с домашним заданием на диск | ❌ | ✅ | ✅ |
Ключевые отличия:
-
Автоматический поиск в нескольких школах. Укажите
EDUPAGE_SUBDOMAINSи используйте один общий логин — сервер автоматически найдёт учеников во всех школах. Не нужно вручную составлять сопоставления вида «ученик → школа 1, ученик → школа 2». Если ученик числится в двух школах, напримерschool1иschool2, сервер найдёт его автоматически и предоставит отдельные результаты для каждой школы. -
Инструменты с учётом роли. Сервер определяет, кем вы являетесь в каждой школе — родителем, учеником или учителем, — и выбирает подходящий способ работы. Например,
get_student_timetableпереключается на учётную запись ученика для родителя и напрямую возвращает расписание ученика, если пользователь сам является учеником. Дублировать инструменты не нужно. -
Полный набор функций для изменения данных. Заказ и оценка питания, отправка сообщений и переключение между учётными записями учеников — эти возможности отсутствуют в других серверах.
Сравнение проверено 2026-09-28. Если заметите неточность, пожалуйста, создайте issue.
Возможности
Один MCP-сервер, работающий через stdio и предоставляющий 31 инструмент (опубликован в PyPI под именем edupage-mcp-full):
-
Аутентификация —
login(вход по учётным данным, с автоматическим определением портала или с помощью cookiePHPSESSIDчерезmethod=),login_all(вход в несколько школ одним вызовом),two_factor_finish(завершение ожидающей проверки 2FA),get_subdomains(доступные учётной записи школы, роль и идентификатор пользователя для каждой школы, настройки окружения и динамический поиск субдоменов для родителей). Прежние инструментыauth_status,user_id,login_auto,login_from_sessionиtwo_factor_check_confirmedобъединены с этими. -
Расписание —
get_my_timetable,get_timetable(учитель, ученик, класс или кабинет;end_dateзадаёт диапазон, ранее использовался инструментget_timetable_range),get_student_timetable(поиск ученика по имени в разных школах),get_next_week_timetable,get_next_ringing_time,get_periods,get_school_year -
Ученики —
find_student(поискperson_idпо имени в разных школах),get_student_timetable(поиск в разных школах с учётом роли),scan_students(автоматический поиск всех учеников во всех школах),get_my_students(одноклассники или все ученики школы для родителей),switch_to_student(переключение по идентификатору или имени; только для родителей),switch_to_parent,clear_student_cache(принудительное обновление сохранённых списков учеников) -
Школы —
get_subdomains(субдомены, доступные учётной записи: для родителей определяются динамически; если заданаEDUPAGE_SUBDOMAINS, поиск ограничивается указанными значениями; также возвращается состояние сессии для каждой школы) -
Оценки —
get_grades -
Хронология и уведомления —
get_timeline(category=позволяет выбрать домашние задания, задания, отсутствия, события, новости или всю историю начиная с указанной даты) -
Домашние задания —
get_timeline(category='homework')для просмотра заданий (идентификаторы находятся вadditional_data.superid),get_homework_materialдля чтения текста задания, дат и списка вложений (в уведомлении есть только название и срок сдачи),download_homework_fileдля сохранения одного вложения на диск -
Замены —
get_timetable_changes,get_missing_teachers -
Питание —
get_meals,choose_meal,sign_off_meal,rate_meal -
Сводки за день —
get_day_summary(один вызов собирает расписание, замены, отсутствующих учителей, оценки, питание, домашние задания, задания, отсутствия, новости, события и уведомления за указанную дату — то есть позволяет одним запросом узнать, «что вчера происходило в школе». Каждый раздел обрабатывается отдельно, поэтому сбой в одном из них не прерывает формирование отчёта). В комплект входит навык OpenCodeschool-day-summary, который формирует удобную для чтения сводку в OpenCode. В других клиентах доступны исходные данные в формате JSON. -
Списки —
get_roster(roster_type=позволяет получить список учеников, всех учащихся, учителей, классов, кабинетов или предметов),get_my_students -
Действия —
send_message,switch_to_student,switch_to_parent,custom_request
Начало работы
Понадобится MCP-клиент, например opencode, Claude Desktop или Cursor.
1. Установка
Если вы используете AI-клиент для программирования, часто достаточно простого запроса, например: «Установи EduPage MCP, следуя инструкциям в репозитории GitHub oliverhruby/edupage-mcp». Большинство клиентов с поддержкой MCP помогут выбрать подходящий вариант настройки.
Вариант A — через MCP Registry (рекомендуется; установка в один клик в VS Code / GitHub Copilot)
Сервер опубликован в MCP Registry.
В VS Code или GitHub Copilot найдите «EduPage MCP» и установите сервер одним нажатием.
Также можно воспользоваться прямой ссылкой: mcp://install/io.github.oliverhruby/edupage-mcp
Вариант B — из PyPI
Выберите этот вариант для обычного использования опубликованной версии.
Требования: uv для запуска через uvx или Python 3.10+ для установки через pip.
uvx edupage-mcp-full
# or, if you prefer pip (into whatever environment your MCP client uses):
pip install edupage-mcp-full
uvx запускает пакет без постоянной установки. Если uvx недоступен, сначала установите uv (pip install uv или winget install astral-sh.uv).
Вариант C — из GitHub (последняя версия исходного кода)
Выберите этот вариант, если хотите получить последние изменения до их публикации в PyPI.
Требования: uv для запуска через uvx или Python 3.10+ для установки через pip.
uvx --from "git+https://github.com/oliverhruby/edupage-mcp.git" edupage-mcp-full
# or
pip install "git+https://github.com/oliverhruby/edupage-mcp.git"
Вариант D — Docker
Выберите этот вариант для запуска в изолированном контейнере.
Требования: Docker.
Загрузите готовый образ (рекомендуется):
docker pull ghcr.io/oliverhruby/edupage-mcp:latest
docker run --rm -i \
-e EDUPAGE_USERNAME=your_username \
-e EDUPAGE_PASSWORD=your_password \
ghcr.io/oliverhruby/edupage-mcp:latest
Если вы хотите зафиксировать версию образа, доступны также теги версий, например v0.4.0.
Соберите образ локально из исходного кода (запасной вариант):
docker build -t edupage-mcp-full .
docker run --rm -i \
-e EDUPAGE_USERNAME=your_username \
-e EDUPAGE_PASSWORD=your_password \
edupage-mcp-full
Контейнер использует те же переменные окружения, которые описаны в разделе «Настройка учетных данных». Кроме того, он включает HEALTHCHECK (по умолчанию проверяется работоспособность процесса stdio; в режимах HTTP-транспорта выполняется локальная проверка TCP).
Для HTTP-транспорта при необходимости задайте переменные:
-
MCP_TRANSPORT:stdio(по умолчанию),sseилиstreamable-http -
MCP_HOST: адрес для привязки (по умолчанию127.0.0.1) -
MCP_PORT: порт для привязки (по умолчанию8000) -
MCP_API_KEY: необязательный bearer-токен для HTTP-аутентификации
Если задан MCP_API_KEY, HTTP-запросы должны содержать заголовок Authorization: Bearer .
Если MCP_API_KEY не задан, HTTP-конечные точки не требуют аутентификации. В рабочей среде рекомендуется настроить надлежащую аутентификацию и TLS через обратный прокси или API gateway.
В
pyproject.tomlзакреплена версияmcpFastMCPдляMCPServer`, а поверхность API была изменена; для простоты и стабильности этот сервер рассчитан на API FastMCP v1.
Вариант C — разработка из исходного кода
Выберите этот вариант, если собираетесь вносить изменения или отлаживать проект локально.
Требования: Python 3.10+.
git clone https://github.com/oliverhruby/edupage-mcp.git
cd edupage-mcp
uv sync # or: python -m venv .venv && .venv/bin/python -m pip install -e .
uv run edupage-mcp-full
Вариант D — Docker
Выберите этот вариант для запуска в изолированном контейнере.
Требования: Docker.
Загрузите готовый образ (рекомендуется):
docker pull ghcr.io/oliverhruby/edupage-mcp:latest
docker run --rm -i \
-e EDUPAGE_USERNAME=your_username \
-e EDUPAGE_PASSWORD=your_password \
ghcr.io/oliverhruby/edupage-mcp:latest
Если вы хотите зафиксировать версию образа, доступны также теги версий, например v0.4.0.
Соберите образ локально из исходного кода (запасной вариант):
docker build -t edupage-mcp-full .
docker run --rm -i \
-e EDUPAGE_USERNAME=your_username \
-e EDUPAGE_PASSWORD=your_password \
edupage-mcp-full
Контейнер использует те же переменные окружения, которые описаны в разделе «Настройка учетных данных». Кроме того, он включает HEALTHCHECK (по умолчанию проверяется работоспособность процесса stdio; в режимах HTTP-транспорта выполняется локальная проверка TCP).
Для HTTP-транспорта при необходимости задайте переменные:
-
MCP_TRANSPORT:stdio(по умолчанию),sseилиstreamable-http -
MCP_HOST: адрес для привязки (по умолчанию127.0.0.1) -
MCP_PORT: порт для привязки (по умолчанию8000) -
MCP_API_KEY: необязательный bearer-токен для HTTP-аутентификации
Если задан MCP_API_KEY, HTTP-запросы должны содержать заголовок Authorization: Bearer .
Если MCP_API_KEY не задан, HTTP-конечные точки не требуют аутентификации. В рабочей среде рекомендуется настроить надлежащую аутентификацию и TLS через обратный прокси или API gateway.
В
pyproject.tomlзакреплена версияmcpFastMCPдляMCPServer`, а поверхность API была изменена; для простоты и стабильности этот сервер рассчитан на API FastMCP v1.
2. Настройка учетных данных
Учетные данные можно задать либо через переменные окружения, либо передать их при вызове login (см. раздел «Примеры запросов»).
# Windows (persistent, per-user)
setx EDUPAGE_USERNAME "your_username"
setx EDUPAGE_PASSWORD "your_password"
setx EDUPAGE_SUBDOMAINS "s1,s2,s3" # optional: multiple schools (auto-login + discovery)
# macOS / Linux
export EDUPAGE_USERNAME="your_username"
export EDUPAGE_PASSWORD="your_password"
export EDUPAGE_SUBDOMAINS="s1,s2,s3" # optional
Одна школа? Достаточно задать EDUPAGE_USERNAME и EDUPAGE_PASSWORD. При запуске сервер автоматически определит вашу школу через портал EduPage — указывать поддомен не нужно.
Несколько школ? Добавьте EDUPAGE_SUBDOMAINS, указав поддомены через запятую. При запуске сервер войдет во все школы, используя общие учетные данные.
3. Регистрация в MCP-клиенте
opencode — добавьте конфигурацию в ~/.config/opencode/opencode.json (или opencode.jsonc):
{
"mcp": {
"edupage": {
"type": "local",
"enabled": true,
"command": ["uvx", "edupage-mcp-full"],
"env": {
"EDUPAGE_USERNAME": "{env:EDUPAGE_USERNAME}",
"EDUPAGE_PASSWORD": "{env:EDUPAGE_PASSWORD}",
"EDUPAGE_SUBDOMAINS": "{env:EDUPAGE_SUBDOMAINS}"
}
}
}
}
Задайте учетные данные в оболочке или окружении (либо в
.env) и ссылайтесь на них с помощью{env:VAR}. Также можно указать их непосредственно вenv:. При первом запускеuvxавтоматически установит пакет; команда должна быть доступна вPATH.
Claude Desktop / Cursor — используйте claude_desktop_config.json /
.mcp.json со стандартной записью mcpServers. В ней укажите command/args, ведущие к Python из виртуального окружения и файлу edupage_mcp.py, а также блок env с учетными данными.
После изменения конфигурации клиента перезапустите его, чтобы загрузить MCP-сервер.
Примеры запросов
| Запрос пользователя | Вероятные вызовы инструментов | Ожидаемый ответ |
|---|---|---|
| «Мы подключены и вошли в систему?» | get_subdomains | Доступные поддомены школ (для родителей — определенные в реальном времени), активная школа/поддомен, настройки окружения и состояние входа для каждой школы. |
| «Какие у меня сегодня уроки?» | get_my_timetable | Краткое расписание на сегодня. |
| «Покажи расписание 9.A на 2026-09-10» | get_timetable target_type="class" target_id="9.A" date_str="2026-09-10" | Расписание класса на указанную дату. |
| «Какие у меня оценки за этот семестр?» | get_grades term="FIRST" year=2026 | Сводка оценок по предметам за выбранный семестр и год. |
| «Сегодня есть замены?» | get_timetable_changes | Изменения в расписании, отмены и замены на сегодня. |
| «Что сегодня на обед и закажи на завтра вариант 2» | get_meals → choose_meal date_str="2026-09-10" meal_type="lunch" number=2 | Меню и подтверждение заказа либо понятное сообщение об ошибке, если заказ недоступен. |
| «Найди расписание Student A на завтра» | get_student_timetable name="Student A" date_str="2026-09-10" | Расписание Student A; если ученик найден в нескольких школах, для каждой школы будет отдельный результат. |
| «Покажи список учителей и отправь привет Teacher456» | get_roster roster_type="teachers" → send_message recipient_id="Teacher456" body="Hello!" | Список учителей и подтверждение отправки сообщения. |
| «Что вчера происходило в школе у моих детей?» | get_day_summary date_str="2026-09-09" (индекс для поиска) → get_day_summary date_str="2026-09-09" name="Student A" subdomain="school-a" → ... name="Student B" subdomain="school-b" | Сначала выполняется поиск: вызов без имени перечисляет каждого ребенка в каждой школе. Затем для каждого ребенка отдельно формируется полный отчет за день (расписание, замены, отсутствующие учителя, оценки, питание, домашние задания, задания, пропуски, новости, мероприятия, уведомления). Такой подход сохраняет ответы компактными и не смешивает школы и учеников. |
| «Как прошел сегодняшний школьный день у Student A?» | get_day_summary name="Student A" (по умолчанию — за сегодня) | Понятная сводка, сформированная с помощью встроенного навыка OpenCode school-day-summary. |
Несколько школ и автоматическое обнаружение учеников
Для каждого поддомена (школы) хранится отдельная авторизованная сессия. Есть два способа одновременно войти в несколько школ:
A) Автоматический вход при запуске (рекомендуется). Задайте EDUPAGE_SUBDOMAINS (список через запятую), а также общие EDUPAGE_USERNAME / EDUPAGE_PASSWORD — сервер войдёт во все школы при запуске. Все инструменты сразу будут готовы к работе, а ученики будут автоматически обнаружены во всех школах. Вызывать вход и вручную сопоставлять учеников со школами не потребуется:
setx EDUPAGE_SUBDOMAINS "school1,school2,school3" # Windows
export EDUPAGE_SUBDOMAINS="school1,school2,school3" # macOS / Linux
get_subdomains # lists school1, school2, school3 (logged in, with role)
scan_students # discovers Student A and Student B across those schools
get_student_timetable name="Student A" # is found at school1 AND school2
B) Вход по запросу с помощью login_all. Авторизуйтесь сразу в нескольких школах, а затем указывайте subdomain при вызове любого инструмента для работы с данными. Если параметр не задан, используется последний активный поддомен:
login_all subdomains="school1,school2" usernames="u1,u2" passwords="p1,p2"
get_my_timetable subdomain="school1"
get_my_timetable subdomain="school2"
get_subdomains # shows all logged-in subdomains + which is active
Также можно вызывать login отдельно для каждой школы, чтобы постепенно добавлять сессии или находить уже созданные.
Только одна школа? Переменная
EDUPAGE_SUBDOMAINSне нужна — при запуске сервер автоматически определит школу через портал. Если школ две или больше, задайтеEDUPAGE_SUBDOMAINSдля автоматического входа или используйтеlogin_all/ несколько вызововlogin.
Поиск учеников по имени (например, «расписание для Student A»)
Сервер автоматически обнаруживает учеников во всех школах, перечисленных в EDUPAGE_SUBDOMAINS, или во всех школах с активной сессией, если переменная не задана. Поэтому указывать, в какой школе учится ученик, не нужно. Просто запросите расписание по имени — сервер выполнит поиск во всех школах, доступных для поиска:
get_student_timetable name="Student A"">
"timetable for Student A" -> get_student_timetable name="Student A"
get_student_timetable (без subdomain):
-
ищет ученика во всех школах, доступных для поиска: в школах из
EDUPAGE_SUBDOMAINSили во всех школах с активной сессией, если переменная не задана. Инструментscan_studentsвыполняет только поиск учеников; -
для каждой школы, где найден ученик, переключается на его учётную запись, если выполнен вход как родитель, возвращает расписание ученика на указанную дату и затем снова переключается на учётную запись родителя;
-
возвращает отдельный результат для каждой школы.
Если ученик посещает несколько школ (например, учится в school1 и school2), инструмент вернёт список из двух расписаний — по одному для каждой школы. Результаты не объединяются. Это встроенная замена ручному сопоставлению вида «ученик → school1»: при заданной EDUPAGE_SUBDOMAINS поиск выполняется автоматически.
Справочник по инструментам
| Инструмент | Описание | Изменяет данные? |
|---|---|---|
login | Вход по имени пользователя и паролю: method="credentials" (по умолчанию), method="auto" (автоматическое определение через портал, ранее login_auto) или method="session" с файлом cookie PHPSESSID (ранее login_from_session). Поддерживаются переменные среды. | ✅ сессия |
login_all | Вход сразу в несколько школ одним вызовом | ✅ сессия |
two_factor_finish | Завершение ожидающего подтверждения входа с 2FA: ввод code из письма или приложения либо подтверждение устройства через poll_seconds (ранее two_factor_check_confirmed + two_factor_finish) | ✅ сессия |
get_subdomains | Доступные поддомены школ (для родителей обнаруживаются при запросе; при заданной EDUPAGE_SUBDOMAINS список ограничен её значениями), а также роль и идентификатор пользователя в каждой школе, активный поддомен, неудачные попытки входа и настройки среды (ранее auth_status, user_id) | |
get_school_year | Текущий учебный год | |
get_my_timetable | Расписание вошедшего пользователя на указанную дату | |
get_timetable | Расписание учителя, ученика, класса или кабинета; для диапазона дат используется end_date (ранее get_timetable_range) | |
get_student_timetable | Расписание ученика по имени или идентификатору с учётом роли и поиском во всех школах | ✅ сессия |
get_next_week_timetable | Расписание с понедельника по пятницу на следующую неделю | |
get_next_ringing_time | Время следующего звонка (перемена или урок) относительно указанного времени | |
get_periods | Расписание звонков: время начала и окончания уроков | |
get_grades | Оценки; при необходимости можно указать учебный год и четверть | |
get_timeline | Уведомления в ленте. За один вызов указывается одна категория category=: recent, history (начиная с date_from), homework, assignments, absences, events, news (ранее get_notifications, get_notification_history, get_homework, get_assignments, get_absences, get_upcoming_events, get_news) | |
get_homework_material | Полный текст задания, даты и список вложений. Для поиска задания используется superid из get_timeline(category='homework') → additional_data.superid | |
download_homework_file | Скачивание одного вложения по URL из get_homework_material на диск (по умолчанию /homework; существующие файлы не перезаписываются) | ✅ диск |
get_timetable_changes | Замены и изменения в расписании на указанную дату | |
get_missing_teachers | Отсутствующие учителя на указанную дату | |
get_day_summary | Ежедневный отчёт одним вызовом: расписание, замены, учителя, оценки, питание (включая завтрак и ужин, если опубликованы), домашние задания, задания, отсутствия, новости, события и уведомления. Можно указать ученика по имени или идентификатору; учитывается роль. Сначала выполняется обнаружение: если родитель не указал name / student_id, возвращается краткий список учеников по школам (mode:"discovery"). Укажите full=True, чтобы сформировать полные отчёты для всех детей. В комплект входит навык OpenCode school-day-summary, формирующий понятный текстовый отчёт. | |
get_meals | Меню питания для всех пяти приёмов пищи: завтрак, перекус, обед, полдник и ужин | |
choose_meal | Заказ питания | ✅ |
sign_off_meal | Отмена заказа питания | ✅ |
rate_meal | Оценка питания по качеству и количеству | ✅ |
get_roster | За один вызов можно указать один roster_type=: students (ученики класса вошедшего пользователя), all_students (краткий список учеников всей школы), teachers, classes, classrooms, subjects (ранее get_students, get_all_students, get_teachers, get_classes, get_classrooms, get_subjects) | |
get_my_students | Ученики, доступные вошедшей учётной записи (в одной школе) | |
find_student | Поиск идентификатора person_id ученика по имени во всех школах | |
scan_students | Автоматический поиск учеников во всех школах, указанных в EDUPAGE_SUBDOMAINS, или во всех школах с активной сессией, если переменная не задана | |
clear_student_cache | Очистка кэша списков учеников в одной или всех школах | ✅ кэш |
get_subdomains | Доступные поддомены школ, а также роль и состояние сессии для каждой школы | |
send_message | Отправка сообщения пользователю | ✅ |
switch_to_student | Переключение на учётную запись ученика по идентификатору или имени (только для родителей) | ✅ сессия |
switch_to_parent | Возврат к учётной записи родителя | ✅ сессия |
custom_request | Отправка произвольного запроса GET/POST через активную сессию | ✅ |
Данные и безопасность
-
Большинство инструментов только считывают данные. Инструменты, отмеченные «Изменяет данные? ✅», изменяют состояние EduPage: отправляют сообщения, оформляют заказы питания или переключают учётные записи. Используйте их с осторожностью.
-
download_homework_file— единственный инструмент, который записывает файлы на локальный диск. Он сохраняет файлы вdest_dir(по умолчанию/homework), использует имя изcontent-dispositionна сервере, если оно указано, и добавляет к имени(1),(2)и так далее, не перезаписывая существующие файлы. -
Категории
homework,assignments,absences,eventsиnewsинструментаget_timelineиспользуют данные из уведомлений в ленте. Если школа не передаёт уведомления о некоторых типах событий, соответствующие категории могут возвращать пустые списки. -
Инструмент
get_missing_teachersпомечен разработчиками как экспериментальный: он разбирает HTML-страницу замен и может завершиться ошибкой, если формат имени учителя изменится. -
Оценка питания с помощью
rate_mealи заказ блюд зависят от наличия в школе опубликованного меню с соответствующими идентификаторами. Не все школы поддерживают оценки. -
Сначала
get_mealsобращается к специальной конечной точке заказа питания для учеников, необходимой для оформления заказов и выставления оценок. Если школа её не поддерживает, инструмент использует общедоступный виджет меню столовой школы (/menu/?wid=menu_CanteenMenu_1). Результат всегда содержит все пять приёмов пищи:breakfast,snack,lunch,afternoon_snackиdinner. Для приёмов пищи, которые школа не публикует, возвращается значениеNone.
Навыки
В пакет входит навык OpenCode (school-day-summary) по адресу
/edupage_mcp/skills/school-day-summary/SKILL.md. Он помогает
агентам OpenCode преобразовывать JSON от get_day_summary в понятный ежедневный
отчёт о школьных событиях.
Только для OpenCode: чтобы добавить навык:
/edupage_mcp/skills/school-day-summary/SKILL.md
~/.config/opencode/skills/school-day-summary/SKILL.md">
mkdir -p ~/.config/opencode/skills/school-day-summary
cp <site-packages>/edupage_mcp/skills/school-day-summary/SKILL.md \
~/.config/opencode/skills/school-day-summary/SKILL.md
Перезапустите OpenCode. После этого агент сможет ответить на вопрос *«Что вчера
происходило в школе у моих детей?»*, вызвав get_day_summary для каждого ребёнка.
Другие MCP-клиенты (Copilot, Claude, Cursor и т. д.) — вызывайте get_day_summary
напрямую: в ответ они получат полный структурированный JSON. Способ форматирования
зависит от клиента: в протоколе MCP нет системы навыков.
Участие в проекте
Рекомендации для участников и сопровождающих проекта приведены в файле CONTRIBUTING.md.
-
Процесс внесения изменений и настройка локальной среды
-
Архитектура и детали реализации
-
Процесс выпуска релизов (PyPI, GitHub Releases, GHCR)
-
Проверки качества в CI и отслеживание изменений покрытия в upstream-проекте
Ограничения
- Проект неофициальный и по своей сути в основном предназначен для чтения. EduPage может в любой
момент изменить свои конечные точки; надёжность в конечном счёте зависит от edupage-api, а не от этой оболочки.
- Обход CAPTCHA не поддерживается. Если при входе EduPage запрашивает CAPTCHA, сначала войдите через
браузер, затем используйте login method="session" с полученным значением PHPSESSID.
-
Для 2FA требуется участие человека: подтвердите вход на устройстве или укажите код.
-
Аккаунты родителей и учителей проверены в upstream-проекте лишь частично; некоторые методы для родителей работают по возможности.
-
Сеанс авторизации существует, пока работает процесс MCP-сервера. После перезапуска клиента потребуется войти снова.
-
Поиск учащихся в нескольких школах зависит от того, выполнен ли вход во все нужные школы
(через EDUPAGE_SUBDOMAINS, login_all или повторные вызовы login).
Если вход в школу не выполнен, найти данные учащегося из этой школы не удастся.
Поддержка
Если вам нравится этот проект и вы хотите поддержать его или предложить новую функцию, угостите меня
пивом: это помогает расслабиться и наводит на новые идеи :-)
Лицензия
MIT © Oliver Hrubý
Этот проект не связан с Ascora (EduPage) и не одобрен этой компанией,
а также не связан с авторами edupage-api и не одобрен ими. EduPage — зарегистрированная торговая марка
соответствующих владельцев.