Skip to content
Agentmart
Submit a tool

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

IndexedMITLocal (stdio)★ 4
Write a review

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.

We use your email only for this newsletter. Privacy

About

EduPage MCP: timetables, grades, homework, meals, messages, 2FA, multi-school, role-aware.

No 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_student
  • get_day_summary
  • get_grades
  • get_homework_material
  • get_meals
  • get_missing_teachers
  • get_my_students
  • get_my_timetable
  • get_next_ringing_time
  • get_next_week_timetable
  • get_periods
  • get_roster
Show 7 more tools
  • get_school_year
  • get_student_timetable
  • get_subdomains
  • get_timeline
  • get_timetable
  • get_timetable_changes
  • scan_students

Write 7 · Create, change, send or run things.

  • choose_meal
  • custom_request
  • download_attachment
  • login
  • login_all
  • send_message
  • sign_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_meal
  • switch_to_parent
  • switch_to_student
  • two_factor_finish

Secrets and settings it asks for

Secrets: values you paste in that let it act as you.

  • EDUPAGE_PASSWORD
  • EDUPAGE_USERNAME

Other settings (environment variables or headers).

  • EDUPAGE_SUBDOMAINS

Network hosts it talks to 5

  • agent-plugins.org · found in code
  • github.com · found in code
  • glama.ai · found in code
  • json.schemastore.org · found in code
  • tdqs.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_meal

    Order/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_cache

    Force 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_request

    Send 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_attachment

    Download 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_student

    Look 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_summary

    One-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_grades

    Get 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_material

    Full 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_meals

    Get 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_teachers

    Get 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_students

    Get 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_timetable

    Get 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_time

    Get 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_timetable

    Get 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_periods

    Get 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_roster

    Get 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_year

    Return 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_timetable

    Get 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_subdomains

    List 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_timeline

    Get 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_timetable

    Get 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_changes

    Get 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`.

  • login

    Log 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_all

    Log 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_meal

    Rate 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_students

    Discover 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_message

    Send 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_meal

    Cancel 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_parent

    Switch 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_student

    Switch 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_finish

    Finish 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
    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)