edupage-mcp
edupage-mcp is a read-only MCP server for EduPage. It lets MCP clients and agents query timetable data, grades, notifications, meals, and school metadata through the edupage-api library.
Supported Features
Supported tools:
get_timetableget_gradesget_notificationsget_teachersget_studentsget_classesget_subjectsget_mealsget_substitutionsget_timetable_changesget_homeworkdownload_homework_file
get_homework and download_homework_file are not backed by edupage-api (which has no homework/material support); they parse EduPage's internal material-player page directly. Pass the superid from a homework notification's additional_data (see get_notifications) to get_homework to read the assignment text and list its attachments, then pass an attachment URL to download_homework_file to save it locally.
Experimental tool:
get_missing_teachers
get_missing_teachers is exposed, but some schools block teacher substitution visibility entirely, so it may return an availability message instead of teacher data.
Requirements
- Python
3.10+ uv- An EduPage account
- EduPage 2FA disabled
- Your school subdomain from
https://<subdomain>.edupage.org
Environment variables:
EDUPAGE_USERNAME=your_username
EDUPAGE_PASSWORD=your_password
EDUPAGE_SUBDOMAIN=your_school_subdomain
Run It
Install and run from PyPI with uvx:
uvx edupage-mcp
For local development:
uv sync
uv run edupage-mcp
The server uses stdio transport, so it is meant to be launched by an MCP client.
MCP Setup
OpenCode
Add this to ~/.config/opencode/opencode.json or project opencode.json:
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"edupage": {
"type": "local",
"command": ["uvx", "edupage-mcp"],
"environment": {
"EDUPAGE_USERNAME": "your_username",
"EDUPAGE_PASSWORD": "your_password",
"EDUPAGE_SUBDOMAIN": "your_school_subdomain"
}
}
}
}
Claude Desktop
Add this to your Claude Desktop MCP config:
{
"mcpServers": {
"edupage": {
"command": "uvx",
"args": ["edupage-mcp"],
"env": {
"EDUPAGE_USERNAME": "your_username",
"EDUPAGE_PASSWORD": "your_password",
"EDUPAGE_SUBDOMAIN": "your_school_subdomain"
}
}
}
}
Tool Summary
| Tool | Parameters | Description |
|---|---|---|
get_timetable |
date_str |
Timetable for a date. Defaults to today. |
get_grades |
year, term |
Grades, optionally filtered by school year and term. |
get_notifications |
date_from |
Notifications, optionally from a given date onward. |
get_teachers |
none | Teachers at the school. |
get_students |
none | Students in the logged-in student's class. |
get_classes |
none | School classes. |
get_subjects |
none | School subjects. |
get_meals |
date_str |
Meal menu for a date. Defaults to today. |
get_substitutions |
date_str |
Raw substitution rows for a date. Defaults to today. |
get_timetable_changes |
date_str |
Timetable changes for a date. Defaults to today. |
get_homework |
superid |
Full homework/material content (text + attachment list) for a homework notification. |
download_homework_file |
url, filename, dest_dir |
Download a homework attachment to disk. dest_dir overrides the default (EDUPAGE_DOWNLOAD_DIR env var, or ~/Downloads/edupage-mcp). |
get_missing_teachers |
date_str |
Absent teachers for a date. Experimental. |
Limitations
- Read-only only (
download_homework_filewrites files to local disk, but does not submit or modify anything on EduPage) - No 2FA support
- Parent and teacher accounts are not verified
- Depends on upstream
edupage-apibehavior
Acknowledgements
This project would not be possible without the upstream edupage-api library:
Metadata
Release files for edupage-mcp 0.1.2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| edupage_mcp-0.1.2.tar.gz | 18.1 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| edupage_mcp-0.1.2-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 36.7 kB
Release files / edupage_mcp-0.1.2.tar.gz
| Download URL | edupage_mcp-0.1.2.tar.gz |
|---|---|
| Size | 18.1 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
d54ea6ad030af06e7d6bfd0ddc63277c703b73775939cd4e625fe27b9a646e45
|
|
BLAKE2b-256 checksum How to use checksums |
6ee3f022a5a1bc72081f56ff02045d0d65ebf1ba4e46860dc194247e1c9a4a29
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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 Sep 15, 2026.
Transparency logRelease files / edupage_mcp-0.1.2-py3-none-any.whl
| Download URL | edupage_mcp-0.1.2-py3-none-any.whl |
|---|---|
| Size | 18.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
315b3e85015258909605c4cdd8a2a6762139f2c0cebb00c00774b0db472bca4c
|
|
BLAKE2b-256 checksum How to use checksums |
9d62388b6637b48a1113840168d37ed276b472da7701942e97b717a4ad41b728
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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 Sep 15, 2026.
Transparency log