EduPage MCP Server
EduPage MCP: timetables, grades, homework, meals, messages, 2FA, multi-school, role-aware.
Connector by oliverhruby · GitHub account verified by the MCP Registry
Install
Works with Claude Code, Codex, VS Code, Cursor, Windsurf, Claude Desktop. Read the repository before you give any tool access to your data.
npx agentmarket install connector/oliverhruby-edupage-mcp
Asks which of your tools to add it to (Claude Code, Codex, Cursor, VS Code, Windsurf, Gemini CLI, Claude Desktop) and shows the change first. See https://agentmart.dev/cli.
Get the weekly diff
The weekly diff: one email a week with new agent tools, notable updates and grade changes, plus security alerts for tools you follow. Double opt-in, one-click unsubscribe.
About
Reviews
Write a reviewNo reviews yet. Installed it? Reviews come from verified installers only. How reviews work
Permissions
What this server can do and what it asks for, from its tool list, install config and code. Checked Oct 25, 2026.
- Tools
- 19 read · 7 write · 1 delete · 4 not yet classified
- Secrets
- 2 (API keys, tokens or passwords)
- Install scripts
- None found
- Runs as
- Python package
Tools by what they do 31
Read from the source code; the running server may list different tools.
Read 19 · Look things up without changing anything.
find_studentget_day_summaryget_gradesget_homework_materialget_mealsget_missing_teachersget_my_studentsget_my_timetableget_next_ringing_timeget_next_week_timetableget_periodsget_roster
Show 7 more tools
get_school_yearget_student_timetableget_subdomainsget_timelineget_timetableget_timetable_changesscan_students
Write 7 · Create, change, send or run things.
choose_mealcustom_requestdownload_attachmentloginlogin_allsend_messagesign_off_meal
Delete 1 · Delete, drop, revoke or wipe things.
clear_student_cache
Not yet classified 4 · We could not tell from the name and description.
rate_mealswitch_to_parentswitch_to_studenttwo_factor_finish
Secrets and settings it asks for
Secrets: values you paste in that let it act as you.
EDUPAGE_PASSWORDEDUPAGE_USERNAME
Other settings (environment variables or headers).
EDUPAGE_SUBDOMAINS
Network hosts it talks to 5
agent-plugins.org· found in codegithub.com· found in codeglama.ai· found in codejson.schemastore.org· found in codetdqs.dev· found in code
Files it touches
- Your home directory (~)
~/.config/opencode/skills~/.copilot~/.copilot/skills- Any path the agent passes to its tools
Tools (31)
Read from the source code; the running server may differ. Descriptions are the server’s own words; hidden characters are shown as [U+…].
choose_mealOrder/choose a meal. Writes: books the selected menu for the date. Args: date_str: YYYY-MM-DD to order for. meal_type: 'snack' | 'lunch' | 'afternoon_snack'. number: 1-based menu choice among the chooseable menus (see `get_meals`). subdomain: School to query (defaults to the active subdomain). Returns: dict: {'ordered': True, meal_type, date, number}. Notes: - Read `get_meals` first for the date to pick a valid `number`. - To cancel, use `sign_off_meal`.
clear_student_cacheForce refresh of cached student data. Writes: drops the local cache so the next student lookup re-fetches from EduPage. Call this after students are added/removed from a school, or if `scan_students`/`find_student` seems stale. Args: subdomain: School whose cache to clear. Without it, clears ALL schools. Returns: dict: {'cleared': <subdomain|'all'>, 'entries_removed': <int>}.
custom_requestSend a raw request to the Edupage server using the active session. Can perform writes depending on the endpoint — treat as write-capable. Args: url: Absolute URL, or a path like '/export/ajax_prevedene_meno.php' (resolved against `https://<subdomain>.edupage.org`). method: 'GET' or 'POST'. data: Request body (for POST). headers: JSON string of extra headers, e.g. '{"Accept": "application/json"}'. subdomain: School whose session to use (defaults to the active). Returns: dict: {'status_code': int, 'content_type': str, 'bytes': int, 'text': str, 'truncated': …
download_attachmentDownload one attachment from the school to disk. Writes: creates a local file. Saves any authenticated attachment — homework material, message and event attachments alike, which is what `get_timeline` puts in `additional_data.attachements` and `get_homework_material` lists — as the raw response bytes, never overwriting (a ' (1)', ' (2)', ... suffix is appended instead). School pages are not attachments: an HTML or login page is refused rather than written out. Because the bytes go to disk untouched, this is the only tool that returns a binary attachment intact; `custom_request` refuses one. …
find_studentLook up a student by first/last/full name using tiered matching. Read-only. Without a `subdomain`, searches ALL logged-in schools and returns one result per school where the student is found. Args: name: First, last or full student name (also 'Novák V.' short names). subdomain: Restrict the search to one school (default: all logged-in schools in scope). Returns: dict with `results`: [{name, student_id, class_id, subdomain, tier, confidence}] sorted by confidence. Tiers: 1=exact, 2=first name, 3=last name, 4=substring. Notes: - Use a `student_id` from the resu…
get_day_summaryOne-call daily school report for a date (default today): timetable, substitutions, missing teachers, grades received that day, meals, homework, assignments, absences, news, events, and timeline notifications. Composes the individual section tools so you don't need to fire 8-10 calls to answer "what happened yesterday at school" or "what's coming tomorrow". - If `name`/`student_id` is provided: report for that specific student (found across all schools unless `subdomain` scopes it). - If omitted: **discovery-first** — for a **parent** this returns a lightweight per-school index of the acco…
get_gradesGet grades for the logged-in student. Read-only. Args: year: School-year start year to filter by (e.g. 2025 for 2025/26). term: 'FIRST' or 'SECOND' to restrict the term. subdomain: School to query (defaults to the active subdomain). Returns: dict: {'subdomain', 'grades': [serialized grades with subject, teacher, percent, ...]}. Notes: - When both `year` and `term` are omitted returns the current gradebook. - Use `get_school_year` to resolve the current school-year start.
get_homework_materialFull body text and attachment list of one homework/assignment material. Read-only. Fetches the school's material-player page for `superid` and flattens its widget tree into plain text plus absolute attachment URLs — the timeline notification carries only a short summary, never the assignment body or the attachment list, so this is the only way to read what the assignment says. Args: superid: Material id, taken from `additional_data.superid` of a notification returned by `get_timeline(category='homework')`. subdomain: School whose session to use (defaults to the active subdoma…
get_mealsGet the meal menu for a date. Read-only. Always returns all five meal slots (breakfast, snack, lunch, afternoon_snack, dinner) — slots not published by the school are ``None``. Args: date_str: YYYY-MM-DD (default today). subdomain: School to query (defaults to the active subdomain). Returns: dict: {'date', 'subdomain', 'meals': {breakfast/snack/lunch/ afternoon_snack/dinner: menus}}. Each menu carries chooseable/ordered info usable with `choose_meal` / `sign_off_meal`. Notes: - Tries the personal ordering endpoint first; when the school hasn't enabled it, falls…
get_missing_teachersGet teachers missing on a date (default today). Read-only. Args: date_str: YYYY-MM-DD (default today). subdomain: School to query (defaults to the active subdomain). Returns: dict: {'date', 'subdomain', 'teachers': [serialized missing teachers]}. Empty list when no teacher is missing. Notes: - Pair with `get_timetable_changes` for the full substitution picture.
get_my_studentsGet the students visible to the logged-in account. Read-only: parent accounts see their linked children (parsed from the school homepage); student/teacher accounts see classmates. Uses cached data. Args: subdomain: School to query (defaults to the active subdomain). Returns: dict: {'subdomain', 'students': [{person_id, name, class_id, ...}]} usable with `switch_to_student` and `get_student_timetable`. Notes: - Prefer `get_my_students` over `get_roster` to see *your* children / classmates; `get_roster(roster_type='all_students')` lists the whole school. - Cach…
get_my_timetableGet the timetable for the logged-in user on a date. Read-only. Args: date_str: YYYY-MM-DD (default today). subdomain: School to query (defaults to the active subdomain). Returns: dict: {'date', 'subdomain', 'lessons': [serialized lessons]}. Notes: - For *another* student use `get_student_timetable` (by name/id); for a teacher/class/room on a date or a range use `get_timetable`. - Next week for yourself: `get_next_week_timetable`.
get_next_ringing_timeGet the type (break/lesson) and time of the next school-bell ringing. Read-only. Args: date_time_str: ISO datetime to search onward from (default: now). subdomain: School to query (defaults to the active subdomain). Returns: Serialized ringing: type (break/lesson) and time. Notes: - See `get_periods` for the full bell schedule.
get_next_week_timetableGet the Mon-Fri timetable for next week for the logged-in user, grouped by weekday. Read-only. Args: subdomain: School to query (defaults to the active subdomain). Returns: dict: {'monday', 'subdomain', 'week': [{weekday, date, lessons} x5]}. Notes: - Weekdays are 'Po','Ut','St','Št','Pi'. - For the logged-in user on a single day use `get_my_timetable`; for any target (teacher/class/room/student) over a range use `get_timetable` with `end_date`.
get_periodsGet the bell schedule (periods with start/end times). Read-only. Args: subdomain: School to query (defaults to the active subdomain). Returns: dict: {'periods': [{'starttime', 'endtime'}, ...]}. Notes: - Combine with `get_next_ringing_time` for live bell timing.
Show 16 more tools
get_rosterGet a school roster: students, teachers, classes, classrooms or subjects. Read-only. Args: roster_type: Which roster to return: - 'students' — students in the logged-in user's class (formerly `get_students`). - 'all_students' — a short list of all students in the school (formerly `get_all_students`). - 'teachers' — all teachers (formerly `get_teachers`). - 'classes' — all classes (formerly `get_classes`). - 'classrooms' — all classrooms (formerly `get_classrooms`). - 'subjects' — all subjects (formerly `get_subjects`). …
get_school_yearReturn the current school year (starting year). Read-only. Args: subdomain: School to query (defaults to the active subdomain). Returns: dict: {'school_year': <int>, 'subdomain': ...}.
get_student_timetableGet a student's timetable by first/last name OR person_id. Read-only. Without a `subdomain`, searches every school in the discovery scope (the configured `EDUPAGE_SUBDOMAINS`, or all logged-in schools when unset) and returns one result per school where the student is found — so a student attending multiple schools yields separate per-school timetables. Args: name: Student's first/last/full name. student_id: person_id (preferred — unambiguous, see `find_student`). date_str: YYYY-MM-DD (default today). subdomain: Restrict to one school (default: all logged-in schools). Returns:…
get_subdomainsList the school subdomains available to the logged-in account and the server's session status per school, plus overall login state. Read-only. Args: None. This tool takes no arguments — the active credentials and `EDUPAGE_SUBDOMAINS` determine the result entirely. Returns: dict with: - `subdomains`: list of school subdomains available to the account. For a logged-in **parent** account this is live-discovered (via `edupage-api`'s `get_subdomains`, read from the profile page) and includes schools with no session yet; it is limited to `EDUPAGE_SUBDOMAINS`…
get_timelineGet EduPage timeline notifications, filtered by category. Read-only. Args: category: Which event types to return: - 'recent' (default) — all currently visible notifications (homework, tests, messages, grades, events...). - 'history' — all notifications since `date_from` (incl. older ones). - 'homework' — homework assignments (formerly `get_homework`). - 'assignments' — homework, tests, exams and projects (formerly `get_assignments`). - 'absences' — absence records (formerly `get_absences`). - 'events' — upcoming events: t…
get_timetableGet the timetable for a teacher, student, class or classroom on a date (or a date range, see `end_date`). Read-only. Args: target_type: 'teacher' | 'student' | 'class' | 'classroom'. target_id: person/class/classroom id as returned by `get_roster`. date_str: Single day, YYYY-MM-DD (default today). Ignored when `end_date` is given. end_date: When set, returns the timetable for every day from `date_str` (default today) to `end_date` inclusive, keyed by date — the equivalent of the former `get_timetable_range`. subdomain: School to query (defaults to t…
get_timetable_changesGet substitution/timetable changes for a date (default today). Read-only. Args: date_str: YYYY-MM-DD (default today). subdomain: School to query (defaults to the active subdomain). Returns: dict: {'date', 'subdomain', 'changes': [serialized substitutions]}. Empty list when nothing changed or the school publishes none. Notes: - Pair with `get_missing_teachers` for the full substitution picture. - For one student's plan on a day use `get_student_timetable` / `get_timetable`.
loginLog in to Edupage for a school. Writes: establishes (or replaces) the server-side session for that subdomain. Args: username: EduPage account login. Falls back to EDUPAGE_USERNAME. password: Account password. Falls back to EDUPAGE_PASSWORD. subdomain: School subdomain (e.g. 'school'). Falls back to the first value of EDUPAGE_SUBDOMAINS; for method='auto' it is optional and tags the detected school's session. method: How to authenticate: - 'credentials' (default) — username/password for a known subdomain. - 'auto' — portal auto-detect of the scho…
login_allLog in to one or more schools in a single call. Writes: establishes (or replaces) the server-side session for each subdomain. Args: subdomains: Comma-separated school subdomains, e.g. 'school1,school2'. Falls back to EDUPAGE_SUBDOMAINS. usernames: Comma-separated usernames, one per school (or a single one). Falls back to EDUPAGE_USERNAME. passwords: Comma-separated passwords, one per school (or a single one). Falls back to EDUPAGE_PASSWORD. Returns: dict: {'results': [{subdomain, ok, user_id, role, two_factor_required}], 'active_subdomain': ...}. A…
rate_mealRate the taste and portion size of a meal. Writes: submits both scores and overwrites whatever rating this account's student already gave for that date and meal type. One rating per (date, meal_type), filed against the student the session is logged in as. It replaces the previous rating outright — no history is kept and no tool here undoes it — so the call is safe to repeat with the same scores, but changing a score means submitting again and losing the old one. Rate a meal the student actually ate. Read `get_meals` first to confirm the slot is published and to see the current averages. Not …
scan_studentsDiscover all students visible to the logged-in account across the discovery scope (the configured `EDUPAGE_SUBDOMAINS`, or every school when unset). Read-only; uses cached data to avoid redundant API calls. Args: None. This tool takes no arguments — the discovery scope is fixed by `EDUPAGE_SUBDOMAINS` and the logged-in role, both of which are environment/login state rather than per-call input. Returns: dict: {'students': [{name, student_id, class_id, subdomain}], 'total': n}. For a parent account: their linked children in each school; for a student/teacher: classmates…
send_messageSend a message to a recipient. Writes: posts a new message on the recipient's timeline. Args: recipient_id: EduPage id like 'Student123' or 'Teacher456' (see `get_roster`). body: Message text. Must not be empty. subdomain: School to query (defaults to the active subdomain). Returns: dict: {'sent': True, 'timeline_id': <id>}. Notes: - Recipient ids come from `get_roster(roster_type='students'|'teachers')` or `get_my_students`.
sign_off_mealCancel an ordered meal for a date. Writes: releases the booking. Args: date_str: YYYY-MM-DD to cancel. meal_type: 'snack' | 'lunch' | 'afternoon_snack'. subdomain: School to query (defaults to the active subdomain). Returns: dict: {'ordered': False, meal_type, date}.
switch_to_parentSwitch the session back to the parent account (parent accounts only). Writes: changes which account subsequent tools operate as. Args: subdomain: School whose session to restore (defaults to the active). Returns: dict: {'switched_to_parent': True, 'user_id': ...}. Notes: - Pair with `switch_to_student`; only relevant after a parent session was switched to a child.
switch_to_studentSwitch the session to a student account (parent accounts only). Writes: changes which account subsequent tools operate as. Args: student_id: person_id of the child (from `get_my_students`). name: first/last/full name of the child, used when `student_id` is omitted. subdomain: School to query (defaults to the active subdomain). Returns: dict: {'switched_to_student': <person_id>, 'user_id': ...}. Notes: - Revert with `switch_to_parent`. Prefer the stateless `get_student_timetable` (name/student_id) over switching when you only need a timetable.
two_factor_finishFinish a pending 2FA login. Writes: completes the pending auth flow. Only needed after a `login` that returned `two_factor_required: True`. Args: code: Optional email/app verification code. When given it is used directly; otherwise the device-confirmation flow is polled. subdomain: School subdomain whose pending login to complete (defaults to the active subdomain). poll_seconds: How long (seconds) to wait for approval on a device when `code` is not given. Defaults to 60; on timeout the caller can call `two_factor_finish` again later. Returns: d…
Compare and alternatives
Featured in
Signals
- Stars
- 4
- Forks
- 1
- Open issues
- 0
- Weekly downloads
- 146
- Last commit
- Oct 23, 2026 (5 days ago)
- Last release
- Oct 12, 2026 (16 days ago)
- Last package publish
- Oct 12, 2026 (16 days ago)
From GitHub (fetched Oct 24, 2026) and the package registry.
Details
- Registry name
io.github.oliverhruby/edupage-mcp- Version
- 0.7.0
- Auth
- API key
- Packages
- pypi edupage-mcp-full
- License
- MIT
- Repository
- github.com/oliverhruby/edupage-mcp
- First seen
- Oct 24, 2026
- Last checked
- Oct 24, 2026
More from oliverhruby
Cite this page
EduPage MCP Server. Agent Mart. https://agentmart.dev/connectors/oliverhruby-edupage-mcp (last updated 2026-10-24)