EduPage MCP Server
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| MCP_HOST | No | Bind host for HTTP transport (default localhost) | |
| MCP_PORT | No | Bind port for HTTP transport (default 8000) | |
| MCP_API_KEY | No | Optional bearer token for HTTP transport auth | |
| MCP_TRANSPORT | No | Transport mode for the MCP server | stdio |
| EDUPAGE_PASSWORD | Yes | EduPage password | |
| EDUPAGE_USERNAME | Yes | EduPage username or login | |
| EDUPAGE_SUBDOMAINS | No | Comma-separated list of school subdomains for multi-school auto-login (optional) |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| loginA | Log in to Edupage for a subdomain. If username/password/subdomain are
omitted, env vars EDUPAGE_USERNAME, EDUPAGE_PASSWORD, EDUPAGE_SUBDOMAINS are used.
Multiple schools are supported: each |
| login_allB | Log in to one or more schools using multiple subdomains in a single call.
Pass comma-separated values: |
| login_autoC | Log in to Edupage via the portal (auto-detect school). Optionally tag the
resulting session with |
| login_from_sessionB | Create a logged-in Edupage instance from an existing PHPSESSID cookie. |
| two_factor_check_confirmedA | After a login that required 2FA, check whether the confirmation has been
approved on a device. Returns True when safe to call |
| two_factor_finishA | Finish 2FA authentication. If |
| auth_statusA | Show login status for all configured subdomains and the active one. |
| user_idC | Return the logged-in user's Edupage user id. |
| school_yearB | Return the current school year (starting year). |
| get_my_timetableB | Get the timetable for the logged-in user for a date (YYYY-MM-DD, default today). |
| get_student_timetableA | Get a student's timetable by first/last name OR person_id.
Without a |
| get_timetableC | Get the timetable for a teacher, student, class or classroom on a date. target_type: 'teacher' | 'student' | 'class' | 'classroom'. |
| get_next_ringing_timeA | Get the type (break/lesson) and time of the next ringing for a given datetime (ISO, default now). |
| get_next_week_timetableB | Get the Mon-Fri timetable for next week for the logged-in user, grouped by weekday. |
| get_timetable_rangeA | Get timetable for a target (class, student, teacher, classroom) for every day
between start_date and end_date (inclusive). Returns a dict keyed by date
(YYYY‑MM‑DD) with each value being the result of |
| get_periodsB | Get the bell schedule (periods with start/end times) from the logged-in data. |
| get_gradesA | Get grades. Optionally filter by |
| get_notificationsC | Get the list of available timeline notifications (homework, tests, messages, grades, events...). |
| get_notification_historyC | Get timeline notifications since a date (YYYY-MM-DD), including older ones. |
| get_homeworkB | Get homework assignments from the recent timeline notifications. |
| get_assignmentsB | Get all assignments (homework, tests, exams, projects) from the timeline. |
| get_absencesC | Get the student's absence records from the timeline notifications. |
| get_upcoming_eventsC | Get upcoming school events (trips, excursions, meetings, holidays...). |
| get_newsC | Get school news from the timeline notifications. |
| get_timetable_changesB | Get substitution/timetable changes for a date (default today). |
| get_missing_teachersC | Get teachers missing on a date (default today). |
| get_mealsA | Get the meal menu (snack/lunch/afternoon snack) for a date (default today). Tries the personal meal-ordering endpoint first; when the school hasn't enabled it, falls back to the school's public canteen menu widget. By default only snack/lunch/afternoon_snack are returned; set include_breakfast / include_dinner to also include those extra meals (only available via the public widget). |
| choose_mealC | Order/choose a meal for a date. meal_type: 'snack'|'lunch'|'afternoon_snack'. number: 1-based menu choice among the chooseable menus. |
| sign_off_mealB | Cancel an ordered meal for a date. meal_type: 'snack'|'lunch'|'afternoon_snack'. |
| rate_mealC | Rate a meal (1-5 quality and quantity) for a date and meal type. |
| get_day_summaryA | 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".
|
| get_studentsC | Get all students in the logged-in user's class. |
| get_all_studentsC | Get a short list of all students in the school. |
| get_teachersB | Get all teachers in the school. |
| get_classesC | Get all classes in the school. |
| get_classroomsC | Get all classrooms in the school. |
| get_subjectsC | Get all subjects in the school. |
| send_messageB | Send a message to a recipient. recipient_id is an edupage id like 'Student123' or 'Teacher456' (see get_students/get_teachers). |
| get_my_studentsA | Get students visible to the logged-in account: parent accounts see their linked children (parsed from the school homepage); student accounts see classmates. Uses cached data. Returns person_id, name, class_id — usable with switch_to_student and get_student_timetable. |
| switch_to_studentB | Switch to a student account (parent accounts only). Provide |
| find_studentA | Look up a student by first/last/full name using tiered matching.
Without a |
| get_schoolsA | List all schools the server is logged into (from auto-discovery or login_all). Returns each subdomain with its login state, role (student/parent/teacher), 2FA pending status, and user id. |
| clear_student_cacheA | Force refresh of cached student data. Call this after students are added/removed from a school, or if scan_students/find_student returns stale results. Without a subdomain, clears the cache for ALL schools. |
| scan_studentsA | Discover all students visible to the logged-in account across the discovery
scope (the configured |
| switch_to_parentC | Switch back to the parent account (parent accounts only). |
| custom_requestC | Send a raw request to the Edupage server using the active session. method: 'GET'|'POST'. Returns status code and body text. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 46 tools
Many tools have distinct purposes, but significant overlap exists among student-related tools (get_students, get_all_students, get_my_students, scan_students, find_student) and timetable tools (get_my_timetable, get_student_timetable, get_timetable, get_next_week_timetable, get_timetable_range). The descriptions help but an agent could easily misselect without careful reading.
Most tool names follow a consistent verb_noun or noun pattern (get_, login_, switch_), but a few deviate (school_year, user_id, two_factor_check_confirmed). Overall predictable and readable.
46 tools is excessive for the domain, with many overlapping functions and niche authentication/2FA tools that could be consolidated. The count feels heavy and increases selection complexity.
The surface covers a wide range of school operations (timetables, grades, meals, messaging, authentication), but lacks explicit update/delete operations for most resources (e.g., no update_homework, no delete_message). Minor gaps that agents can work around via custom_request.