EduPage Keyring

io.github.stefanbackor由 GitHub 帳號 stefanbackor 發布v0.6.0更新於 Nov 5, 2026

EduPage timetables, grades, homework and messages; session in the OS Credential Store, no password.

概覽

AI 產生的概覽

讀取家長或學生的 EduPage 學校帳號:課表、成績、作業、缺勤、訊息與餐廳菜單,工作階段保存在系統憑證存放區,不需密碼。

可以做什麼
  • 查看帳號與孩子:工作階段狀態、登入、學校清單、孩子資料、學年
  • 讀取課表:單日與整週、任意教師/班級/教室、鐘聲時間、代課與停課、缺席教師
  • 讀取成績與時間軸:各學期成績、作業、測驗與考試、近期活動、缺勤、校園新聞、通知
  • 讀取訊息:清單、全文,以及以 base64 回傳的附件
  • 查詢人員與學校資料:學生、教師、班級、教室、科目
  • 查看餐廳菜單,並傳送訊息或訂餐、退餐、評價午餐
適用情境
適合想讓助理回答日常學校問題的家長或學生,例如每個孩子明天上什麼課、本週要交什麼、近期測驗、成績、缺勤,或學校最近寄來的通知,而不必每次打開 EduPage。
執行需求
透過 uvx 以 stdio 在本機執行(uv 會自行取得 Python),或安裝為 Claude Desktop 擴充功能;支援 macOS,Windows 為 beta。每所學校首次登入需要安裝 Google Chrome。不需設定密碼,只有選用的 EDUPAGE_USERNAME 標籤;學校名稱以命令列參數傳入。
安裝前請注意
儲存的工作階段 Cookie 放在 macOS 鑰匙圈或 Windows 認證管理員,其他 keyring 後端會被拒絕。登入會開啟真實的 Chrome 視窗,密碼與兩步驟驗證由你親自輸入。傳送訊息與餐點操作會變更資料並標示為破壞性,用戶端會先詢問;餐點操作目前不會真正送出。學校文字被視為不可信內容,讀取行為對 EduPage 仍可見。依賴未公開的 EduPage 介面,可能隨時失效。

安裝

在 SourceWeft 中

  1. 開啟 儀表板中的 EduPage Keyring,將其新增到工作區。
  2. 為需要使用其工具的對話啟用該服務。

Desktop only,透過 STDIO。 STDIO 服務會啟動本機處理程序,因此需要 SourceWeft 桌面主機。

其他 MCP 客戶端

參照 儲存庫 中的啟動說明。

README

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 EduPage's session cookie (PHPSESSID) is kept, in your computer's Credential Store: the macOS Keychain, or Windows Credential Manager (Windows support is beta). Built on edupage-api.

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)

Install

Claude Desktop: one-click extension

  1. Download edupage-keyring-mcp.mcpb from the latest release.
  2. Double-click it (or drag it onto Settings → Extensions in Claude Desktop) and choose Install.
  3. Enter your School: the name before .edupage.org, or your school's EduPage address. Several schools: separate them with commas (first, second); the first is the default. Two accounts at one school: myschool=teacher (see Options).

You need macOS or Windows (beta, see Windows) and Google Chrome. Nothing else to install: when the extension is installed, Claude Desktop downloads its own copy of uv, which sets up Python and the extension's dependencies. The extension runs on your computer like any local MCP server, with the same Saved Sessions in the Credential Store. Then go on with Ask something.

Updates are manual. The extension does not update itself. To get a new version, download edupage-keyring-mcp.mcpb from the link above again and install it over the old one. Want updates on every restart instead? Use uvx.

Any client: run it with uvx

1. Get the requirements

You need macOS or Windows (beta), Google Chrome, and uv:

sh
brew install uv          # or: curl -LsSf https://astral.sh/uv/install.sh | sh

On Windows, see Windows.

Nothing else to install: uvx downloads this server from PyPI and runs it in its own isolated environment.

2. Connect your client

Desktop apps need the full path to uvx; get it with which uvx (Windows: where uvx). It is usually /opt/homebrew/bin/uvx (Homebrew), /Users/YOU/.local/bin/uvx (installer script) or C:\Users\YOU\.local\bin\uvx.exe (Windows). Replace myschool with your school: the name before .edupage.org, or simply your school's whole EduPage address, such as https://myschool.edupage.org.

Claude Desktop: open Settings → Local MCP servers → Edit Config (older versions: Settings → Developer → Edit Config) and add:

json
{  "mcpServers": {    "edupage": {      "command": "/opt/homebrew/bin/uvx",      "args": ["edupage-keyring-mcp@latest", "--school", "myschool"]    }  }}

Quit Claude Desktop (⌘Q on macOS; on Windows, quit it from the system tray) and reopen it.

Claude Code:

sh
claude mcp add edupage --scope user -- uvx edupage-keyring-mcp@latest --school myschool

Codex CLI:

sh
codex mcp add edupage -- uvx edupage-keyring-mcp@latest --school myschool

Cursor: add the Claude Desktop JSON above to ~/.cursor/mcp.json.

VS Code: .vscode/mcp.json, or MCP: Open User Configuration:

json
{  "servers": {    "edupage": {      "type": "stdio",      "command": "/opt/homebrew/bin/uvx",      "args": ["edupage-keyring-mcp@latest", "--school", "myschool"]    }  }}

Any other client: run uvx edupage-keyring-mcp@latest --school myschool as a stdio server.

Ask something

Ask Claude about school, for example "What's on the timetable tomorrow?". The first time, Claude opens your school's EduPage in a Chrome window (Claude Desktop asks you first). Sign in there the way you always do: password, two-factor or QR code. The window closes by itself, the session is saved to the Credential Store, and Claude answers. If macOS asks whether Python may use the Keychain, choose Always Allow.

Prefer to sign in before connecting a client? Run uvx edupage-keyring-mcp login myschool (this works for the Claude Desktop extension too: both use the same Saved Session).

Options

Add these to the args list (or after --school myschool on the command line). The Claude Desktop extension has only the School and Keep-alive fields, so of these it takes several schools and account labels, written in the School field, and the keep-alive.

  • Several schools: repeat --school: "--school", "first", "--school", "second", or separate them with commas: "--school", "first,second". The first is the default. A school without a saved session reports AUTH_REQUIRED and does not affect the others.
  • Two accounts at one school (say, as a parent and as a teacher): give each its own label, for example "--school", "myschool=teacher", and sign in to each once. The label only names its Credential Store entry.
  • No sign-in windows from the server: "--no-browser-signin". sign_in then reports SIGNIN_UNAVAILABLE, and you sign in with login in a terminal (see Command line).
  • Keep-alive (on by default): EduPage signs a session out after about 2 hours (sometimes under 2) without use. So every 60 minutes the server loads the EduPage home page of each school it has already used. Change the interval with "--keep-alive", "90" (5 to 120; smaller values count as 5), or turn it off with "--keep-alive", "0". It never opens a school you haven't used since the client started and never opens a sign-in window. If EduPage has ended the session anyway, the server stops for that school until you next use it, and the server log gets one line with the school and status code. It only runs while the client is open and the computer is awake: after a night asleep you may still need to sign in again. In the Claude Desktop extension, this is the Keep-alive (minutes) field.
  • 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.

Updates

  • uvx: @latest makes uvx check PyPI each time the client starts the server, so a new release is picked up on the next client restart.
  • Claude Desktop extension: updated by hand only. Download the new edupage-keyring-mcp.mcpb and install it over the old one.

What changed is on the releases page.

Windows (beta)

Windows support is beta until someone has done a full sign-in on a real Windows machine; please report how it goes.

  • Google Chrome must be installed; sign-in opens it.
  • Claude Desktop extension: nothing else to install, as on macOS.
  • uvx: install uv (for example winget install --id=astral-sh.uv -e, or powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"). uv fetches Python itself; an existing Python 3.10 or newer works too.
  • Where the session is kept: Windows Credential Manager. To see or delete it, open Control Panel → Credential Manager → Windows Credentials and look for the entries under edupage-keyring-mcp (or run uvx edupage-keyring-mcp logout myschool).

Signing in again

A session lasts until EduPage expires it, which it does after about 2 hours without use. While your client is open, the keep-alive prevents that. Once it has expired anyway (say, after the computer slept), Claude does the same as the first time: it gets AUTH_REQUIRED and asks whether it may open the sign-in. If you agree, it calls sign_in, and a Chrome window opens on your school's EduPage. While you sign in, Claude waits with wait_for_sign_in, which returns as soon as you're done, and carries on with your question. No restart is needed, and you don't have to tell Claude you're done. The window waits up to 10 minutes.

Set up before version 0.2 with EDUPAGE_USERNAME? Keep it to go on using the session you saved then, or remove it and sign in once more.

Command line

text
edupage-keyring-mcp [serve] --school NAME[=LOGIN] [--school ...] [--download-host HOST] [--no-browser-signin]                    [--keep-alive MINUTES]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

Run each with uvx edupage-keyring-mcp@latest ..., also when you use the Claude Desktop extension: the commands work on the same Saved Sessions. logout removes the local session only; EduPage itself is not logged out. probe is handy when reporting a problem: its output contains no school data.

Features

36 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

ToolReturns
auth_statusWhether the saved session works, and how a sign-in started by sign_in went
sign_inOpens EduPage's sign-in page in Chrome when the session is missing or expired
wait_for_sign_inWaits (up to 50 s per call) for that sign-in to finish, then reports the new session
list_schoolsSchools, session status, role (parent, student, teacher), number of children
list_childrenYour children: name, class, student ID, ref
user_id, school_yearAccount ID and role; current school year

Timetables

ToolReturns
get_timetableA child's lessons for a date, with substitutions applied: times, subject, teacher, room, group, topic, cancelled flag
get_week_timetableMonday to Friday for a child
get_timetable_forTimetable of any teacher, class, classroom or student
get_periods, get_next_ringing_timeBell schedule; next lesson or break
get_timetable_changesSchool-wide substitutions and cancellations for a date
get_missing_teachersTeachers absent on a date

Grades and the timeline

ToolReturns
get_gradesSubject, title, grade, comment, weight, points and percent, class average, teacher; current or a past term
get_homeworkHomework with full text, subject, author and due date
get_assignmentsHomework, tests and exams
get_upcoming_eventsTests announced as events (topic and date), trips, meetings, holidays
get_absencesAbsences, excuses, arrival and departure scans
get_newsSchool news
get_notificationsAny 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

ToolReturns
list_messagesMessages with sender, recipient, for_children, snippet, number of files
get_messageFull text and the files attached; no read receipt is sent
get_attachmentA 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 returns a child's menus for a day (dishes, allergens, portion weights), serving times, the current order and which menus can be picked. It returns MEALS_NOT_AVAILABLE when the school has no canteen module. The server reads the school's /menu/ page directly, because edupage-api 0.13.3 can't parse the page's current format.

choose_meal, sign_off_meal and rate_meal still go through edupage-api. Until a release of it reads the current page, they send nothing and return MEAL_ACTIONS_UNAVAILABLE with a short explanation; order, cancel and rate in EduPage itself.

Actions

ToolDoesChecks
send_messageSends an EduPage message as youRecipient must be a real teacher, student or parent ID; 1 to 5,000 characters
choose_mealOrders menu A to H for a childMeal type, date within 30 days, menu must be choosable
sign_off_mealCancels a child's mealMeal type, date
rate_mealRates a served lunch 1 to 5Lunch 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 Credential Store entry (a Saved Session) holds only EduPage's session cookie, PHPSESSID, plus the account ID and the login name EduPage reports. Sessions saved by older versions with more cookies keep working until they expire. No username is needed either. The server refuses to start if any EDUPAGE_* environment variable other than the optional EDUPAGE_USERNAME label is set.
  • Sign-in from the server stays local. sign_in takes only a configured school and runs the same login command in a separate process. It opens a window only when the saved session is missing or expired, at most one per school at a time, and returns only that command's status code. The window shows EduPage's real login page, so the most a misbehaving model can do is open it. Turn it off with --no-browser-signin; the Claude Desktop extension has no such setting, so use the uvx install if you need it.
  • OS Credential Store only. Saved Sessions go only to the macOS Keychain or Windows Credential Manager, through keyring's built-in backends. With any other keyring backend (third-party password managers, file-based keyrings) or on another platform the server refuses to run with CREDENTIAL_STORE_REQUIRED, so sessions never land in a plaintext keyring file. See ADR 0001. On Windows the entry is kept on this computer only and never roams with a domain profile.
  • 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 Credential Store 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.
  • Each child call picks its child. EduPage remembers which child a parent session last selected, and some pages (grades, menus) show that child. So every child-scoped call selects its own child immediately before reading, under a per-school lock; if selecting fails, the session is dropped. Pages for the parent (timeline, messages, sending) are not affected by the selection: a message sent after selecting a child still comes from the parent.
  • 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 EduPage library. edupage-api is pinned to an exact, reviewed version; other dependencies take compatible updates within their major version.

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

See SECURITY.md to report a vulnerability.

Contributing

Development setup, tests and releases are in CONTRIBUTING.md.

Credits

Built on edupage-api, a community Python library for EduPage accounts, licensed under GPL-3.0. It does the EduPage requests and parsing; this project adds the Credential Store sessions, browser sign-in, network confinement and the MCP tools. Its version is pinned exactly, so a new edupage-api release reaches users only through a release of this project.

Disclaimer

This is an independent open-source project. It is not affiliated with, endorsed by, or supported by aSc Applied Software Consultants, s.r.o., the company that makes EduPage. The EduPage name is used only to say which service this software works with. All EduPage access goes through edupage-api, an independent community library that is not part of this project either. It relies on EduPage's undocumented web endpoints, which can change without notice; when they do, this server may stop working until edupage-api and then this project are updated. Use it at your own risk.

License

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

來源:README.md,提交 32409db

工具

0
SourceWeft 曾在隔離沙箱中以無憑證方式啟動該軟體包一次,以列出其工具,但未能完成:伺服器未能啟動。

版本歷史

5
  1. v0.6.0最新Nov 5, 2026
  2. v0.5.0Nov 4, 2026
  3. v0.4.0Nov 3, 2026
  4. v0.3.0Nov 3, 2026
  5. v0.1.0Nov 3, 2026

評分

已滿足適用檢查項的 50%

該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。

  • 近 30 天內可連通25 分

    請保持端點能夠回應 MCP 握手;SourceWeft 每 30 天探測一次。

  • 已宣告認證方式10 分

    請在註冊中心條目中宣告憑證請求標頭,或保持端點能夠回應探測,以便判定其認證方式。

  • 已列出工具15 分

    請讓伺服器在無憑證時回應 tools/list,或發布可在沙箱中無憑證啟動的軟體包。

  • 描述必需15 分
  • 圖示10 分
  • 文件15 分
  • 授權條款10 分