Skip to main content
Glama

Edupage MCP Server

MCP server that connects Claude to Edupage — a school information system used across Europe. Provides access to timetables, grades, homework, messages, students, teachers, and more.

Quick Setup

1. Install

cd /path/to/edupage-mcp
uv sync

Or if you prefer a one-liner without cloning:

uv pip install "mcp>=1.2.0" "edupage-api>=0.12.3"

2. Configure for Claude Code

The easiest way — just open the project folder and the .mcp.json will be picked up automatically. Set environment variables first:

export EDUPAGE_USERNAME=your_user
export EDUPAGE_PASSWORD=your_pass
export EDUPAGE_SUBDOMAIN=your_school

Or add the server manually:

claude mcp add edupage -- uv run --directory /path/to/edupage-mcp python -m edupage_mcp

With auto-login via environment variables:

claude mcp add --env EDUPAGE_USERNAME=your_user --env EDUPAGE_PASSWORD=your_pass --env EDUPAGE_SUBDOMAIN=your_school edupage -- uv run --directory /path/to/edupage-mcp python -m edupage_mcp

3. Configure for Claude Desktop

Add to your Claude Desktop config (~/Library/Application Support/Claude/claude_desktop_config.json on macOS):

{
  "mcpServers": {
    "edupage": {
      "command": "uv",
      "args": ["run", "--directory", "/path/to/edupage-mcp", "python", "-m", "edupage_mcp"],
      "env": {
        "EDUPAGE_USERNAME": "your_username",
        "EDUPAGE_PASSWORD": "your_password",
        "EDUPAGE_SUBDOMAIN": "your_school"
      }
    }
  }
}

4. Configure for Cowork

Use the .mcp.json file included in this repo — just set the environment variables.

Related MCP server: Schulmanager Online MCP Server

Authentication

Two options:

  1. Environment variables (recommended) — set EDUPAGE_USERNAME, EDUPAGE_PASSWORD, and EDUPAGE_SUBDOMAIN. The server logs in automatically at startup.

  2. Manual login tool — call the login or login_auto tool at the start of your session.

The subdomain is the part before .edupage.org in your school's URL (e.g. myschool for https://myschool.edupage.org).

Available Tools

Tool

Description

login

Log in with username, password, subdomain

login_auto

Log in via portal (auto-detect school)

get_timetable

Get timetable for a date

get_next_week_timetable

Get Mon-Fri timetable for next week

get_timetable_changes

Get substitutions / changes for a date

get_grades

Get student grades/marks

get_students

Get students in your class

get_all_students

Get all students in the school

get_teachers

Get all teachers

get_classes

Get all classes

get_classrooms

Get all classrooms

get_homework

Get homework assignments

get_assignments

Get all assignments (homework, tests, etc.)

get_timeline

Get recent timeline items

get_notifications

Get recent notifications

get_notification_history

Get notifications since a date

get_news

Get school news

get_meals

Get meal information

send_message

Send a message to users

get_subjects

Get all subjects

get_periods

Get bell schedule / periods

get_my_children

Get children linked to a parent account

get_absences

Get student absences

get_upcoming_events

Get upcoming school events (filters on the real event date parsed from the title, not the post date)

get_student_summary

All-in-one summary: grades, homework, exams, absences

get_school_days

Per-date "is the kid at school over lunch?" view fusing trips, excursions, and absences (⚠️ holidays NOT covered)

Project Structure

edupage-mcp/
├── CLAUDE.md              # Developer guide
├── pyproject.toml         # Package config (uv/hatch)
├── .mcp.json              # Claude Code project config
├── .env.example           # Example environment variables
└── src/
    └── edupage_mcp/
        ├── __init__.py
        ├── __main__.py
        └── server.py      # MCP server implementation

Development

Run the server directly for testing:

uv run python -m edupage_mcp

Test with MCP Inspector:

npx @modelcontextprotocol/inspector uv run python -m edupage_mcp

Dependencies

  • mcp >= 1.2.0 — Model Context Protocol Python SDK

  • edupage-api >= 0.12.3 — Unofficial Edupage API client (GitHub)

Notes

  • The server uses stdio transport (reads stdin, writes stdout)

  • All logging goes to stderr to avoid corrupting the MCP protocol

  • Session persists for the lifetime of the server process

  • The send_message tool sends real messages — use with care

  • If Edupage requests a CAPTCHA, log in via browser first then retry

  • Event dates vs. post dates: Edupage "event" timeline items store the post date (when the announcement was published) in their timestamp; the real event date lives in the title (e.g. Udalosť: Sternwarte - 17.06.2026). get_upcoming_events parses that title date and filters on it, so events announced months ahead still surface. get_timeline / get_notifications expose an opt-in by_event_date flag to apply their date range to the parsed event date instead of the timestamp.

  • get_school_days does NOT cover holidays. It surfaces trips, excursions, and absences only. Public / Brandenburg state holidays and school-closure days are not reliably present in Edupage data, so undisrupted days come back in_school: null (unknown), never true. Cross-check a public-holiday source or the caterer's menu before assuming a child is at school.

License

This project is licensed under the GPL-3.0-or-later — see the LICENSE file for details.

The edupage-api dependency is GPL-3.0 licensed, which requires derivative works to use a compatible license.

Available Tools

25 tools
get_absencesA

Get absence records from the last N days.

Args: since_days: How many days back to search (default 30) student_name: Optional student name to validate context (e.g. 'Jan Novak'). Searches all schools automatically. school: School subdomain (only needed with multiple schools and no student_name).

Returns: JSON array of absence records with date, type, text, author

Inputs: school, since_days, student_name. Returns: result

get_all_studentsA

Get all students in the school (name + class only).

Args: school: School subdomain (only needed with multiple schools).

Returns: JSON array of student skeletons

Inputs: school. Returns: result

get_assignmentsA

Get all assignments (homework, tests, exams, projects, etc.) from the last N days.

Args: since_days: How many days back to search (default 30) status: Filter by status — "active", "done", or "" (all, default) event_type: Narrow to specific types (comma-separated). Valid types: homework, etesthw, bexam, sexam, oexam, rexam, pexam, testing school: School subdomain (only needed with multiple schools).

Returns: JSON array of assignment items

Inputs: school, status, event_type, since_days. Returns: result

get_classesA

Get all classes in the school.

Args: school: School subdomain (only needed with multiple schools).

Returns: JSON array of lean class records

Inputs: school. Returns: result

get_classroomsA

Get all classrooms in the school.

Args: school: School subdomain (only needed with multiple schools).

Returns: JSON array of lean classroom records

Inputs: school. Returns: result

get_gradesA

Get student grades/marks. Returns grades for the current session's child. For parent accounts with multiple children, grades are for the child linked to the current session.

Args: term: Term/semester filter (leave empty for all) year: School year filter (leave 0 for current) school: School subdomain (only needed with multiple schools).

Returns: JSON array of lean grade records with percent, class_avg, etc.

Inputs: term, year, school. Returns: result

get_homeworkA

Get homework assignments from the last N days. Extracts homework from the timeline/notification history.

Args: since_days: How many days back to search (default 30) status: Filter by status — "active" (not done), "done", or "" (all, default) school: School subdomain (only needed with multiple schools).

Returns: JSON array of homework items with title, subject, due_date, etc.

Inputs: school, status, since_days. Returns: result

get_mealsB

Get school meal information for a given date (defaults to today).

Args: date_str: Date in YYYY-MM-DD format. Leave empty for today. school: School subdomain (only needed with multiple schools).

Returns: JSON of meal data (snack, lunch, afternoon_snack)

Inputs: school, date_str. Returns: result

get_my_childrenA

Get your children (for parent accounts) or classmates (for student accounts). Use this to find student names for use with other tools like get_timetable, get_absences, and get_student_summary.

Args: school: School subdomain (only needed with multiple schools).

Returns: JSON array of students with person_id, name, class_id, number

Inputs: school. Returns: result

get_newsB

Get school news from the Edupage webpage.

Args: school: School subdomain (only needed with multiple schools).

Returns: JSON array of news items

Inputs: school. Returns: result

get_next_week_timetableA

Get timetable for each day of the upcoming week (Mon-Fri).

Args: class_name: Class name (e.g. '6e', '4a'). If empty, uses logged-in user's timetable. student_name: Student name to look up their class timetable (searches all schools). school: School subdomain (only needed with multiple schools and no student_name).

Returns: JSON object keyed by date with lean timetable lessons

Inputs: school, class_name, student_name. Returns: result

get_notification_historyA

Get notification history since a given date.

Args: since_date: Start date in YYYY-MM-DD format. Defaults to 7 days ago. status: Filter — "active", "done", or "" (all, default). starred: Filter — "yes", "no", or "" (all). event_type: Raw type filter (comma-separated). category: Category filter: homework, grades, exams, messages, absences, events, news. limit: Max items (default 50). offset: Skip items for pagination. include_system: Include system events (default false). school: School subdomain (only needed with multiple schools).

Returns: JSON array of lean notification events

Inputs: limit, offset, school, status, +5 more. Returns: result

get_notificationsA

Get recent notifications. System events are hidden by default.

Args: status: Filter — "active", "done", or "" (all, default). starred: Filter — "yes", "no", or "" (all). event_type: Raw type filter (comma-separated). category: Category filter: homework, grades, exams, messages, absences, events, news. limit: Max items (default 50). offset: Skip items for pagination. include_system: Include system events (default false). school: School subdomain (only needed with multiple schools).

Returns: JSON array of lean notification events

Inputs: limit, offset, school, status, +4 more. Returns: result

get_periodsA

Get school period / bell schedule information.

Args: school: School subdomain (only needed with multiple schools).

Returns: JSON array of periods with start/end times

Inputs: school. Returns: result

get_studentsB

Get students in your class.

Args: school: School subdomain (only needed with multiple schools).

Returns: JSON array of lean student records

Inputs: school. Returns: result

get_student_summaryA

Get a comprehensive summary for a student: grades, homework, exams, absences, and messages — all in one call.

Args: student_name: Student name (e.g. 'Jan Novak'). Use get_my_children() to find names. Searches all schools automatically. since_days: How many days back to include (default 14) school: School subdomain (only needed when student exists in multiple schools).

Returns: JSON object with student, class, grades, homework, exams, absences, messages

Inputs: school, since_days, student_name. Returns: result

get_subjectsA

Get all subjects taught at the school.

Args: school: School subdomain (only needed with multiple schools).

Returns: JSON array of lean subject records

Inputs: school. Returns: result

get_teachersA

Get all teachers in the school.

Args: school: School subdomain (only needed with multiple schools).

Returns: JSON array of lean teacher records

Inputs: school. Returns: result

get_timelineA

Get the visible timeline (recent messages, assignments, grades). System events (H_* types) are hidden by default.

Args: status: Filter by status — "active" (default), "done", or "all". starred: Filter by starred — "yes", "no", or "" (all). event_type: Raw type filter (comma-separated, e.g. "sprava,znamka"). category: Human-friendly category. One of: homework, grades, exams, messages, absences, events, news. Mutually exclusive with event_type. date_from: Start date (YYYY-MM-DD) for date range filter. date_to: End date (YYYY-MM-DD) for date range filter. limit: Max items to return (default 50). offset: Items to skip for pagination. include_system: Include system events like H_* types (default false). school: School subdomain (only needed with multiple schools).

Returns: JSON array of lean timeline events

Inputs: limit, offset, school, status, +6 more. Returns: result

get_timetableA

Get the timetable for a given date (defaults to today).

Args: date_str: Date in YYYY-MM-DD format. Leave empty for today. class_name: Class name (e.g. '6e', '4a'). If empty, uses logged-in user's timetable. student_name: Student name to look up their class timetable (e.g. 'Jan Novak'). Resolves the student's class automatically (searches all schools). school: School subdomain (only needed with multiple schools and no student_name).

Returns: JSON array of lean timetable lessons

Inputs: school, date_str, class_name, student_name. Returns: result

get_timetable_changesA

Get timetable changes / substitutions for a date (defaults to today).

Args: date_str: Date in YYYY-MM-DD format. Leave empty for today. school: School subdomain (only needed with multiple schools).

Returns: JSON array of timetable changes

Inputs: school, date_str. Returns: result

get_upcoming_eventsA

Get upcoming events and exams within the next N days.

Args: days_ahead: How many days ahead to look (default 30) school: School subdomain (only needed with multiple schools).

Returns: JSON array of upcoming events sorted by date (nearest first)

Inputs: school, days_ahead. Returns: result

loginA

Log in to Edupage using environment variables. No parameters needed if EDUPAGE_USERNAME, EDUPAGE_PASSWORD, and EDUPAGE_SUBDOMAIN are set. Supports multiple schools via comma-separated subdomains.

Args: username: Your Edupage username (defaults to EDUPAGE_USERNAME env var) password: Your Edupage password (defaults to EDUPAGE_PASSWORD env var) subdomain: Your school's Edupage subdomain, or comma-separated list for multi-school (defaults to EDUPAGE_SUBDOMAIN env var)

Returns: Success or error message

Inputs: password, username, subdomain. Returns: result

login_autoA

Log in to Edupage via the portal (auto-detect school). No parameters needed if EDUPAGE_USERNAME and EDUPAGE_PASSWORD are set.

Args: username: Your Edupage username / email (defaults to EDUPAGE_USERNAME env var) password: Your Edupage password (defaults to EDUPAGE_PASSWORD env var)

Returns: Success or error message

Inputs: password, username. Returns: result

send_messageA

Send a message to one or more Edupage users. ⚠️ Use with care – this sends real messages.

Args: recipients: Comma-separated list of recipient names (must match teacher/student names exactly) body: The message text to send school: School subdomain (required when recipient exists in multiple schools).

Returns: Success or error message

Inputs: body (required), recipients (required), school. Returns: result

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    A3.7/5.0

    Scored across 25 tools

    Disambiguation3/5

    Some tools have overlapping purposes, e.g., get_notifications and get_notification_history both retrieve notification events, and get_assignments includes homework which is also covered by get_homework. Agents could misselect without careful description reading.

    Naming Consistency4/5

    Most read tools follow a consistent 'get_' prefix pattern, but the presence of login, login_auto, and send_message breaks the uniformity. These are necessary actions, so the deviation is minor.

    Tool Count4/5

    25 tools is slightly above the typical 3-15 range but still reasonable for a comprehensive school information system. The count includes essential login and messaging functions alongside many read endpoints.

    Completeness4/5

    The tool set covers most common school data viewing needs: grades, homework, timetable, absences, etc. Missing write operations beyond send_message (e.g., marking homework done) but that may be by design for a read-focused server.

    Maintenance

    ActivityMaintained
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers