Skip to main content

EduPage Keyring MCP

An MCP server that lets Claude (or any MCP client) read your EduPage school account: timetables, grades, homework, tests, absences, messages, menus and more, for every child and school you have, without ever storing your password.

You sign in once per school in Chrome, on EduPage's own page, two-factor included. Only the resulting session cookies are kept, in the macOS Keychain. Built on edupage-api.

Unofficial. Not affiliated with EduPage or aSc Applied Software Consultants. EduPage's web endpoints are undocumented and can change without notice. macOS only.

What you can ask

  • "What does each kid have tomorrow, and what's due this week?"
  • "Any tests coming up for Šimon? Which topics?"
  • "How are Ema's grades in Slovak this term?"
  • "Did Peter get to school on time today?"
  • "Summarize what the school sent in the last two weeks and flag anything I must act on."
  • "Which of today's lessons are substituted for 5.C?"
  • "Tell the class teacher that Ema will be absent on Friday." (Claude Desktop asks before sending)

Why this one

edupage-keyring-mcp Typical EduPage MCP servers
Password Never stored; typed only into EduPage in Chrome EDUPAGE_PASSWORD in a config file
Two-factor login Yes, on EduPage's own page Often unsupported or tool-driven
Several children Matched by name; every timeline item says which child it is for Varies
Several schools Yes, one Keychain session each Varies
Network Confined to your school's host; every redirect checked; responses capped Library defaults
Writes 4 actions, marked destructive so clients ask first; inputs checked Often none, or a raw-request tool
Errors Fixed status codes; never server pages Raw exception text
Dependencies Exact pins plus a hashed uv.lock Ranges

Install

Requirements: macOS, Google Chrome, and uv.

export EDUPAGE_USERNAME='you@example.com'      # your EduPage login name (not secret)
uvx edupage-keyring-mcp login myschool        # myschool = the part before .edupage.org

Chrome opens on your school's login page. Sign in there, including any two-factor prompt. When EduPage shows your account, the window closes and the session is saved to the Keychain. If macOS asks whether Python may use the Keychain, choose Always Allow.

Check it:

uvx edupage-keyring-mcp status --school myschool

A session lasts until EduPage expires it. Tools then return AUTH_REQUIRED (or SESSION_EXPIRED); run login again. EDUPAGE_USERNAME only labels the Keychain entry; the login name EduPage itself reports is stored at sign-in.

Connect Claude Desktop

Open Settings → Local MCP servers → Edit Config (older versions: Settings → Developer → Edit Config) and add:

{
  "mcpServers": {
    "edupage": {
      "command": "/Users/YOU/.local/bin/uvx",
      "args": ["edupage-keyring-mcp", "--school", "myschool"],
      "env": { "EDUPAGE_USERNAME": "you@example.com" }
    }
  }
}

Use the output of which uvx as command. Quit Claude Desktop (⌘Q) and reopen it.

  • Several schools: repeat --school: "--school", "first", "--school", "second". The first is the default. A school without a saved session reports AUTH_REQUIRED and does not affect the others.
  • Different login at one school: "--school", "second=other@example.com".
  • Attachments on EduPage file servers: if get_attachment reports REDIRECT_NOT_ALLOWED, allow that exact host with "--download-host", "cloud-4.edupage.org". Only *.edupage.org hosts are accepted.

Other MCP clients: run edupage-keyring-mcp --school myschool as a stdio server.

Features

34 tools. Each takes an optional school. Child tools take child: a first name (accents optional, so simon finds Šimon), full name, student ID, or the ref from list_children.

Account and children

Tool Returns
auth_status Whether the saved session works
list_schools Schools, session status, role (parent, student, teacher), number of children
list_children Your children: name, class, student ID, ref
user_id, school_year Account ID and role; current school year

Timetables

Tool Returns
get_timetable A child's lessons for a date, with substitutions applied: times, subject, teacher, room, group, topic, cancelled flag
get_week_timetable Monday to Friday for a child
get_timetable_for Timetable of any teacher, class, classroom or student
get_periods, get_next_ringing_time Bell schedule; next lesson or break
get_timetable_changes School-wide substitutions and cancellations for a date
get_missing_teachers Teachers absent on a date

Grades and the timeline

Tool Returns
get_grades Subject, title, grade, comment, weight, points and percent, class average, teacher; current or a past term
get_homework Homework with full text, subject, author and due date
get_assignments Homework, tests and exams
get_upcoming_events Tests announced as events (topic and date), trips, meetings, holidays
get_absences Absences, excuses, arrival and departure scans
get_news School news
get_notifications Any timeline item, optionally by EduPage type (znamka, homework, ...)

Timeline tools look back up to 90 days (default 30). Every item has for_children: which of your children it is addressed to, by name or class. With child set, items addressed to a sibling are left out.

Messages

Tool Returns
list_messages Messages with sender, recipient, for_children, snippet, number of files
get_message Full text and the files attached; no read receipt is sent
get_attachment A PDF, PNG, JPEG or GIF attached to a message, up to 3 MB, base64

People and school data

get_students, get_all_students, find_student, get_teachers (IDs for send_message), get_classes, get_classrooms, get_subjects.

Meals

get_meals: a child's menu, allergens and current order, or MEALS_NOT_AVAILABLE when the school has no canteen module.

Actions

Tool Does Checks
send_message Sends an EduPage message as you Recipient must be a real teacher, student or parent ID; 1 to 5,000 characters
choose_meal Orders menu A to H for a child Meal type, date within 30 days, menu must be choosable
sign_off_meal Cancels a child's meal Meal type, date
rate_meal Rates a served lunch 1 to 5 Lunch only, last 14 days

These are marked destructiveHint; clients such as Claude Desktop ask before each call.

Security model

  • No password anywhere. It is typed only into EduPage's page in a throwaway Chrome window. The Keychain item holds EduPage session cookies, the account ID and the login name EduPage reports. The server refuses to start if any EDUPAGE_* environment variable other than EDUPAGE_USERNAME is set.
  • Keychain only. On anything but the macOS Keychain backend the server refuses to run, so sessions never land in a plaintext keyring file.
  • Confined network. edupage-api gets a replacement session that allows HTTPS to your configured school host only, checks every redirect hop, caps every response at 8 MB (attachments at 3 MB) and ignores proxy and .netrc settings. Cookies loaded from the Keychain are validated for that host first.
  • Narrow inputs. No tool accepts a URL, cookie, session ID, header or password. Dates are ISO and window-limited. school only picks a configured school. Attachments are fetched by file id; the model never sees their URLs.
  • Child switching is verified. For parent accounts, child-scoped calls switch to the child and back under a per-school lock, then re-check that the session is the parent again; otherwise it is dropped and recovered before reuse.
  • Quiet errors. Failures return fixed codes (and at most an exception class name), never server pages or messages.
  • Untrusted content. All school text is labelled untrusted_content.
  • Pinned dependencies. Exact versions in pyproject.toml, hashes in uv.lock.

Reading can still be visible to EduPage, like opening a page in the browser.

See SECURITY.md to report a vulnerability.

Commands

edupage-keyring-mcp [serve] --school NAME[=LOGIN] [--school ...] [--download-host HOST]
edupage-keyring-mcp login NAME [--username LOGIN] [--timeout SECONDS]
edupage-keyring-mcp logout NAME [--username LOGIN]
edupage-keyring-mcp status --school NAME [...]
edupage-keyring-mcp probe --school NAME [...]   # every read tool once; statuses and counts only

logout removes the local session only; EduPage itself is not logged out.

Development

git clone https://github.com/stefanbackor/edupage-keyring-mcp
cd edupage-keyring-mcp
uv sync --locked
uv run pytest

Tests use synthetic data only and never touch the network or the Keychain. Upgrading a dependency means changing its pin in pyproject.toml, running uv lock, and reviewing the diff.

Credits

Built on edupage-api (GPL-3.0). Tool coverage follows Arnost55/edupage-mcp-full.

License

GPL-3.0-or-later. Copyright © 2026 Stefan Backor.

Metadata

Release files for edupage-keyring-mcp 0.1.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for edupage-keyring-mcp 0.1.0
File Size Uploaded Provenance Actions
edupage_keyring_mcp-0.1.0.tar.gz 50.7 kB With provenance Details for edupage_keyring_mcp-0.1.0.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for edupage-keyring-mcp 0.1.0
File Interpreter ABI Platform Actions
edupage_keyring_mcp-0.1.0-py3-none-any.whl Python 3 none any Details for edupage_keyring_mcp-0.1.0-py3-none-any.whl

Total release size: 96.8 kB

Release files / edupage_keyring_mcp-0.1.0.tar.gz

Download URL edupage_keyring_mcp-0.1.0.tar.gz
Size 50.7 kB
Tags Source
SHA-256 checksum
How to use checksums
56cbb1a0b449a25e06f34491b7839908216854afb9856ca37b614e6c516493de
BLAKE2b-256 checksum
How to use checksums
98bf18848505a3045f1d8a90c88d58b5817cf79f2ffe2ee33bd41c47c79eedf2
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Nov 3, 2026.

Transparency log

Release files / edupage_keyring_mcp-0.1.0-py3-none-any.whl

Download URL edupage_keyring_mcp-0.1.0-py3-none-any.whl
Size 46.1 kB
Tags Python 3
SHA-256 checksum
How to use checksums
455cc17ea42c68578db3bf232d28fd576ab2db2475dd4f8ac12ed4ca8ba0a13e
BLAKE2b-256 checksum
How to use checksums
03543487c1361fbe187b4c3a26cbec0364d5d00e1f656de75412214bbc1b8aef
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Nov 3, 2026.

Transparency log

Security for edupage-keyring-mcp 0.1.0

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

All 2 files in this release have been uploaded with provenance metadata.

Select from 2 files

Attestation for edupage_keyring_mcp-0.1.0.tar.gz

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Nov 3, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page