mcpField
E
EduPage MCP Server

EduPage MCP Server

本地服务
github.com科研与教育45 天前更新

关于 EduPage MCP Server

EduPage MCP Server 通过单一 MCP 服务向学生、家长和教师的 AI Agent 提供 EduPage 账户操作。它结合读写功能、按角色适配的访问方式和多校区发现,并使用社区维护的 edupage-api 库。

主要功能

  1. 01查询课表、成绩和代课安排
  2. 02读取作业并下载附件
  3. 03查看和管理餐食选择
  4. 04发送消息并切换学生账户
  5. 05处理 2FA 和多所学校
  6. 06生成每日学校摘要

适用场景

  1. 01查看课表、成绩和学校动态
  2. 02查阅作业并保存附件
  3. 03管理餐食订单和学校消息
  4. 04汇总孩子在多所学校的信息

MCP 相关

该服务将 edupage-api 功能作为 MCP 工具提供给 AI Agent 和其他 MCP 客户端,支持 stdio 及可选的 HTTP 传输。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"oliverhruby-edupage": {
"command": "uvx",
"args": [
"edupage-mcp-full"
],
"env": {
"EDUPAGE_USERNAME": "<EDUPAGE_USERNAME>",
"EDUPAGE_PASSWORD": "<EDUPAGE_PASSWORD>",
"EDUPAGE_SUBDOMAINS": "<EDUPAGE_SUBDOMAINS>"
}
}
}
}
启动命令uvx edupage-mcp-full
需要配置的环境变量
EDUPAGE_USERNAME密钥Your EduPage username
EDUPAGE_PASSWORD密钥Your EduPage password
EDUPAGE_SUBDOMAINSComma-separated school subdomains (optional)

本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
pypiedupage-mcp-full0.7.0

工具

31

收录的工具列表 · 更新于 2 周前

参数类型必填说明
methodany否
passwordany否
usernameany否
subdomainany否
session_idany否

详细介绍

EduPage MCP 服务

GitHub release Glama Grade Quality gates Security Container security Coverage drift

项目介绍

一个 Model Context Protocol(MCP)服务,将 Python 库 edupage-api 的全部功能提供给 opencode、Claude、Cursor 等 AI Agent 以及其他 MCP 客户端。

EduPage 是一种在欧洲各地使用的学校信息系统。此服务让你可以直接通过 Agent 查询和操作学生/教师/家长的 EduPage 账户:课表、成绩、作业、代课、餐食(包括订餐)、消息、名册、家长切换子女等,还支持多所学校(例如两个孩子分别就读于不同学校)。

⚠️ 非官方 API。 与所有 EduPage MCP 服务一样,此服务依赖社区维护的 edupage-api 库,该库会调用 EduPage 未公开的端点。可放心使用只读功能;使用写入功能(send_message、订餐、切换子女)时请谨慎。


目录


为什么还需要另一个 EduPage MCP 服务?

目前已经有另外两个 EduPage MCP 服务:

这两个项目都很不错,我与它们没有关联——这里只是为了诚实地进行比较而提及。它们主要侧重于 API 的只读功能。

本项目有意提供更多功能:

功能mhlavacmrtineu(PyPI)本项目
高级登录——门户自动检测、2FA、会话 ID(PHPSESSID)部分支持(门户)仅基础功能✅
课表(本人及任意教师/班级/教室)✅✅✅
成绩(全部/按学期和学年)✅✅✅
代课/课表变更✅✅✅
餐食——查看菜单✅✅✅
餐食——选择/退订/评分❌❌✅
发送消息(send_message)✅❌✅
家长切换学生(切换到/切换出学生账号)部分支持(列表)❌✅
下次铃声时间/铃声时间表❌❌✅
原始会话自定义请求❌❌✅
多所学校(自动登录与发现)❌❌✅
角色感知(家长/学生/教师)❌❌✅
每日摘要(一次调用生成每日报告)❌❌✅
作业——正文文本和附件❌✅✅
将作业文件下载到磁盘❌✅✅

主要差异:

  • 自动发现多所学校。 使用一个共享登录账号设置 EDUPAGE_SUBDOMAINS,服务便会自动发现所有学校中的学生——无需手动维护“学生 → 学校 1、学生 → 学校 2”映射。同一学生在两所学校就读(例如,在 school1 和 school2 就读)时,系统会自动发现,并分别返回各校的结果。
  • 角色感知工具。 服务会检测你在每所学校中的身份是家长、学生还是教师,并据此采取相应操作——对于家长,get_student_timetable 会切换到学生账号;对于学生,则直接返回课表。无需重复提供工具。
  • 完整的写入功能。 包括订餐/评分、发送消息和切换学生账号——其他服务不支持这些功能。

比较信息核实于 2026-09-28。如果有任何错误,请提交 issue。


功能介绍

一个通过 stdio 暴露 31 个工具的 MCP 服务(在 PyPI 上发布为 edupage-mcp-full):

  • 身份验证 — login(通过凭据、自动检测门户,或通过 method= 使用 PHPSESSID Cookie)、login_all(一次调用登录多所学校)、 two_factor_finish(完成待处理的双重身份验证)、get_subdomains(账户可用的学校,以及每所学校对应的角色/用户 ID 和环境配置;为家长实时发现子域名)。此前的 auth_status、 user_id、login_auto、login_from_session 和 two_factor_check_confirmed 工具已合并到这些工具中。
  • 课表 — get_my_timetable、get_timetable(教师/学生/班级/ 教室;使用 end_date 获取日期范围,原名为 get_timetable_range)、 get_student_timetable(按姓名查找学生,跨学校)、get_next_week_timetable、 get_next_ringing_time、get_periods、get_school_year
  • 学生 — find_student(姓名 → person_id,跨学校)、 get_student_timetable(跨学校,根据角色处理)、scan_students (自动发现所有学校的全部学生)、get_my_students(同学,或家长可查看全校学生)、 switch_to_student(按 ID 或 姓名,仅限家长)、switch_to_parent、 clear_student_cache(强制刷新缓存的学生列表)
  • 学校 — get_subdomains(账户可用的子域名——为家长实时发现;设置 EDUPAGE_SUBDOMAINS 时受其限制——以及每所学校的会话状态)
  • 成绩 — get_grades
  • 时间线/通知 — get_timeline(使用 category= 获取作业、 任务、缺勤、活动、新闻,或获取指定日期以来的完整历史记录)
  • 作业 — 使用 get_timeline(category='homework') 列出作业 (ID 位于 additional_data.superid 中),使用 get_homework_material 读取某项作业的正文、日期和附件列表(通知本身仅包含标题和截止日期),使用 download_attachment 将一个附件保存到磁盘
  • 代课安排 — get_timetable_changes、get_missing_teachers
  • 餐食 — get_meals、choose_meal、sign_off_meal、rate_meal
  • 每日摘要 — get_day_summary(一次调用即可获取某日期的课表、代课安排、 缺勤教师、成绩、餐食、作业、任务、缺勤、新闻、 活动和通知——通过一次往返即可了解“昨天学校发生了什么”;各部分彼此隔离,因此某部分失败不会导致整个报告失败)。附带的 Agent 技能(school-day-summary)可将该 JSON 转换为易读的每日报告——使用 edupage-mcp-full install-skill 安装(参见 技能);每个客户端也可以直接调用 get_day_summary 并读取 JSON。
  • 名册 — get_roster(使用 roster_type= 获取学生、所有学生、 教师、班级、教室或科目)、get_my_students
  • 操作 — send_message、switch_to_student、switch_to_parent、custom_request

开始使用

你需要一个支持 MCP 的客户端(opencode、Claude Desktop、Cursor 等)。

1. 安装

如果你使用 AI 编码客户端,通常只需输入一条简单提示即可开始, 例如:“按照这个 GitHub 仓库 oliverhruby/edupage-mcp 中的说明安装 EduPage MCP。” 大多数支持 MCP 的客户端随后都可以引导你了解可用的安装选项。

选项 A — 作为 Agent 插件(推荐:一次安装服务器和技能)

此仓库为 VS Code、GitHub Copilot 和 Claude Code 提供插件,可将服务器与 school-day-summary Agent 技能一同安装:

copilot plugin marketplace add oliverhruby/edupage-mcp
copilot plugin install edupage@edupage-plugins

Claude Code 使用同一个市场:

claude plugin marketplace add oliverhruby/edupage-mcp
claude plugin install edupage@edupage-plugins

opencode、Cursor 和 Windsurf 支持 Agent Skills,但不支持插件——这些客户端以及 所有其他安装方式,请参阅 docs/PLUGINS.md。

选项 B — 使用 APM 一键安装(通过一条命令安装服务器和技能,可选,正在兴起的标准) APM(Agent Package Manager,Agent 包管理器)是一种新兴的开放标准,用于分发 Agent 上下文——可以把它看作面向 Agent 技能、MCP 服务和指令的 npm。此安装方式是可选的:选项 A 和以下所有安装方式都与以往完全相同。如果你已经在使用 APM(或想试用),这是此处唯一支持跨运行环境一键安装的方式。

  1. 安装一次 CLI。要求:git,以及用于服务运行时的 uv。

    • Windows:winget install --id Microsoft.APM -e(或 scoop bucket add apm https://github.com/microsoft/scoop-apm; scoop install apm)
    • macOS / Linux:brew install apm
    • 任何装有 Python 3.10+ 的平台:pip install apm-cli
    • 其他选项:安装文档
  2. 安装此软件包:

    apm install oliverhruby/edupage-mcp
    

    一条命令即可完成以下两项操作:

    • 将 school-day-summary 技能部署到运行环境的技能目录 (.claude/skills/、.agents/skills/ 等);
    • 将 uvx edupage-mcp-full 标准输入/输出服务条目写入 APM 检测到的所有运行环境的 MCP 配置中(Claude Code、GitHub Copilot、Cursor、opencode、Codex、Gemini、Windsurf、Kiro 等);添加 --target claude(或其他目标)可指定单个运行环境。
  3. 验证:

    apm mcp list        # server registered?
    

    apm uninstall oliverhruby/edupage-mcp 会移除软件包和已部署的技能文件,但会保留它写入 .mcp.json(以及其他运行环境配置)中的 MCP 服务条目——如需删除,请自行移除该条目。

软件包中绝不会嵌入凭据:运行 apm install 之前,请设置 EDUPAGE_USERNAME / EDUPAGE_PASSWORD(多校账号还需设置 EDUPAGE_SUBDOMAINS)——请参阅2. 配置凭据。

固定版本。 附加 #<sha>(或在某个版本包含 apm.yml 后附加 #<tag>),即可固定到精确版本并隐藏 APM 的“dependency unpinned”警告;如果不固定版本,APM 会将解析后的提交记录到 apm.lock.yaml。截至 v0.7.0 的版本早于清单文件,因此在下一个版本发布前,请使用提交 sha。

Claude Code 插件/市场安装方式(选项 A)仍受支持且保持不变——APM 是此仓库 apm.yml 中声明的另一种安装方式。

选项 C — 从 MCP Registry 安装(一键安装,仅服务,不含技能)

此服务已列入 MCP Registry。在 VS Code 或 GitHub Copilot 中搜索“EduPage MCP”,然后单击即可安装。 或者使用直接深层链接:mcp://install/io.github.oliverhruby/edupage-mcp

选项 D — 从 PyPI 安装

适用于使用已发布版本的常规场景。

要求:使用 uvx 需要 uv,使用 pip 需要 Python 3.10+。

uvx edupage-mcp-full
# or, if you prefer pip (into whatever environment your MCP client uses):
pip install edupage-mcp-full

uvx 可在不进行持久安装的情况下运行软件包。如果无法使用 uvx,请先安装 uv(pip install uv 或 winget install astral-sh.uv)。

选项 E — 从 GitHub 安装(最新源码)

如果你想在 PyPI 发布前获取最新更改,请使用此方式。

要求:使用 uvx 需要 uv,使用 pip 需要 Python 3.10+。

uvx --from "git+https://github.com/oliverhruby/edupage-mcp.git" edupage-mcp-full
# or
pip install "git+https://github.com/oliverhruby/edupage-mcp.git"

选项 F — Docker

适用于隔离的容器运行时。

要求:Docker。

拉取预构建镜像(推荐):

docker pull ghcr.io/oliverhruby/edupage-mcp:latest

docker run --rm -i \
  -e EDUPAGE_USERNAME=your_username \
  -e EDUPAGE_PASSWORD=your_password \
  ghcr.io/oliverhruby/edupage-mcp:latest

如果你希望使用固定镜像,也提供版本标签(例如 v0.4.0)。

从源码本地构建(备用方式):

docker build -t edupage-mcp-full .

docker run --rm -i \
  -e EDUPAGE_USERNAME=your_username \
  -e EDUPAGE_PASSWORD=your_password \
  edupage-mcp-full

容器使用配置凭据中所述的相同环境变量。容器还包含一个 HEALTHCHECK(默认检查标准输入/输出进程是否存活;在 HTTP 传输模式下进行本地 TCP 检查)。

对于 HTTP 传输,可设置以下可选运行时变量:

  • MCP_TRANSPORT:stdio(默认)、sse 或 streamable-http
  • MCP_HOST:绑定主机(默认 127.0.0.1)
  • MCP_PORT:绑定端口(默认 8000)
  • MCP_API_KEY:HTTP 身份验证的可选 bearer token 当设置了 MCP_API_KEY 时,HTTP 请求必须包含 Authorization: Bearer <key>。 如果未设置 MCP_API_KEY,HTTP 端点将不进行身份验证。在生产环境中, 建议通过反向代理或 API 网关使用适当的身份验证和 TLS。

pyproject.toml 固定使用 mcp<2(稳定的 FastMCP v1 API)。mcp 2.x 将 FastMCP 重命名为 MCPServer,并更改了 API 接口;为保持简洁和稳定,此服务 使用 FastMCP v1 API。

选项 G — 从源代码进行开发

如果你要贡献代码或在本地调试,请使用此选项。

要求:Python 3.10+。

git clone https://github.com/oliverhruby/edupage-mcp.git
cd edupage-mcp
uv sync               # or: python -m venv .venv && .venv/bin/python -m pip install -e .
uv run edupage-mcp-full
2. 配置凭据

可以设置环境变量,也可以在调用 login 时传入凭据(参见 提示词示例)。

# Windows (persistent, per-user)
setx EDUPAGE_USERNAME "your_username"
setx EDUPAGE_PASSWORD "your_password"
setx EDUPAGE_SUBDOMAINS "s1,s2,s3"       # optional: multiple schools (auto-login + discovery)

# macOS / Linux
export EDUPAGE_USERNAME="your_username"
export EDUPAGE_PASSWORD="your_password"
export EDUPAGE_SUBDOMAINS="s1,s2,s3"     # optional

只有一所学校? 只需设置 EDUPAGE_USERNAME + EDUPAGE_PASSWORD。服务 会在启动时通过 EduPage 门户自动发现你的学校——无需子域名。

有多所学校? 添加 EDUPAGE_SUBDOMAINS(以逗号分隔)。服务 会在启动时使用共享凭据登录所有学校。

3. 在 MCP 客户端中注册

opencode — 添加到 ~/.config/opencode/opencode.json(或 opencode.jsonc):

{
  "mcp": {
    "edupage": {
      "type": "local",
      "enabled": true,
      "command": ["uvx", "edupage-mcp-full"],
      "env": {
        "EDUPAGE_USERNAME": "{env:EDUPAGE_USERNAME}",
        "EDUPAGE_PASSWORD": "{env:EDUPAGE_PASSWORD}",
        "EDUPAGE_SUBDOMAINS": "{env:EDUPAGE_SUBDOMAINS}"
      }
    }
  }
}

将凭据放在 shell/环境变量(或 .env)中,并用 {env:VAR} 引用;也可以直接在 env: 下硬编码。uvx 会在首次使用时自动 安装软件包;它必须位于 PATH 中。

Claude Desktop / Cursor — 使用 claude_desktop_config.json / .mcp.json,并按标准格式添加 mcpServers 条目,将 command/args 指向虚拟环境中的 python 和 edupage_mcp.py 路径,同时添加包含凭据的 env 区块。

编辑客户端配置后,重启客户端以加载 MCP 服务。


提示词示例

用户提示词可能的工具调用预期响应
"我们已连接并登录了吗?"get_subdomains可用学校子域名(家长用户会实时发现)、当前学校/子域名、环境配置,以及各学校的登录状态。
"我今天有哪些课程?"get_my_timetable今天的简短课程表摘要。
"显示 2026-09-10 的 9.A 课程表"get_timetable target_type="class" target_id="9.A" date_str="2026-09-10"该日期的班级课程表。
"我这学期有哪些成绩?"get_grades term="FIRST" year=2026所选学期/年份按科目汇总的成绩。
"今天有代课安排吗?"get_timetable_changes今天的变更、取消和代课安排。
"明天午餐吃什么,帮我订选项 2"get_meals → choose_meal date_str="2026-09-10" meal_type="lunch" number=2餐单和订餐确认(若无法获取,则提供明确错误信息)。
"查找 Student A 明天的课程表"get_student_timetable name="Student A" date_str="2026-09-10"Student A 的课程表;如果在多所学校找到,则每所学校各返回一项结果。
"列出教师并给 Teacher456 发条问候"get_roster roster_type="teachers" → send_message recipient_id="Teacher456" body="Hello!"教师名单以及消息已发送的确认。
"昨天孩子们在学校发生了什么?"get_day_summary date_str="2026-09-09"(发现索引)→ get_day_summary date_str="2026-09-09" name="Student A" subdomain="school-a" → ... name="Student B" subdomain="school-b"先发现,再查询:不带姓名的调用会列出每所学校的每个孩子;然后为每个孩子分别调用一次完整的每日报告(课程表、代课安排、缺席教师、成绩、餐食、作业、任务、缺勤、新闻、活动、通知)。这样可让每条响应保持简短,并避免混淆学校或学生。
"Student A 今天在学校过得怎么样?"get_day_summary name="Student A"(默认为今天)安装捆绑的 school-day-summary skill(edupage-mcp-full install-skill)后,即可获得易读的摘要。

多所学校与学生自动发现

每个子域名(学校)都有其独立的登录会话。可通过以下两种方式同时登录多所学校:

A)启动时自动登录(推荐)。 设置 EDUPAGE_SUBDOMAINS(以逗号分隔的列表)以及共享的 EDUPAGE_USERNAME / EDUPAGE_PASSWORD——服务启动时会登录所有学校,因此所有工具都可立即使用,并且无需调用登录工具,也无需建立学生→学校映射,即可在所有学校中发现学生:

setx EDUPAGE_SUBDOMAINS "school1,school2,school3"   # Windows
export EDUPAGE_SUBDOMAINS="school1,school2,school3" # macOS / Linux
get_subdomains   # lists school1, school2, school3 (logged in, with role)
scan_students      # discovers Student A and Student B across those schools
get_student_timetable name="Student A"   # is found at school1 AND school2

B)按需使用 login_all。 一次验证多所学校,然后向任何数据工具传入 subdomain(省略时,默认使用最近激活的子域名):

login_all subdomains="school1,school2" usernames="u1,u2" passwords="p1,p2"

get_my_timetable subdomain="school1"
get_my_timetable subdomain="school2"
get_subdomains         # shows all logged-in subdomains + which is active

你也可以为每所学校分别调用一次 login,逐步添加或查找会话。

只有一所学校? 无需设置 EDUPAGE_SUBDOMAINS——服务会在启动时通过门户自动发现你的学校。对于两所或更多学校,请设置 EDUPAGE_SUBDOMAINS(自动登录),或使用 login_all / 多次调用 login。


按姓名查找学生(例如“Student A 的课表”)

由于服务会自动发现配置的 EDUPAGE_SUBDOMAINS 中的学生(若未设置该变量,则会发现所有已登录学校中的学生),你无需了解或说明学生就读于哪所学校。只需按姓名查询课表,服务就会搜索范围内的每所学校:

"timetable for Student A"  ->  get_student_timetable name="Student A"

get_student_timetable(不传入 subdomain):

  1. 在发现范围内的每所学校中搜索名字、姓氏或全名匹配的学生——范围为已配置的 EDUPAGE_SUBDOMAINS,若未设置则为所有已登录学校(scan_students 只执行发现步骤),
  2. 对于找到该学生的每所学校,如果你以家长身份登录,则切换到学生账户,返回该学生对应日期的课表,然后切回家长账户,
  3. 每所学校返回一条结果。

因此,就读于多所学校的学生(例如,在 school1 和 school2 就读的学生)会得到两份按学校分别列出的课表——结果彼此独立,不会合并。这一内置功能取代了手动维护“学生 → school1”映射的做法:设置 EDUPAGE_SUBDOMAINS 后,即可完全自动发现学生。


工具参考

工具描述是否写入?
login使用用户名/密码登录;method="credentials"(默认)、method="auto"(门户自动检测,原为 login_auto),或使用 PHPSESSID Cookie 的 method="session"(原为 login_from_session)。支持环境变量。✅ 会话
login_all一次调用登录多所学校✅ 会话
two_factor_finish完成待处理的 2FA 登录(通过电子邮件/应用的 code,或通过 poll_seconds 轮询设备确认;原为 two_factor_check_confirmed + two_factor_finish)✅ 会话
get_subdomains账户可用的子域名(家长账户会实时发现;设置 EDUPAGE_SUBDOMAINS 时仅限其中的子域名)+ 每所学校的角色/用户 ID、当前子域名、登录失败情况、环境配置(原为 auth_status、user_id)
get_school_year当前学年
get_my_timetable登录用户某个日期的课表
get_timetable教师/学生/班级/教室的课表;使用 end_date 指定每日范围(原为 get_timetable_range)
get_student_timetable按姓名或 ID 查询学生课表(识别角色,跨学校查询)✅ 会话
get_next_week_timetable下周周一至周五的课表
get_next_ringing_time指定时间之后的下一次铃声(课间/上课)
get_periods铃声时间表(每节课的开始/结束时间)
get_grades成绩,可按学年和学期筛选
get_timeline时间线通知,一次指定一个 category=:recent、history(从 date_from 起)、homework、assignments、absences、events、news(原为 get_notifications、get_notification_history、get_homework、get_assignments、get_absences、get_upcoming_events、get_news)
get_homework_material按 superid 获取一项作业的完整正文、日期和附件列表;superid 来自 get_timeline(category='homework') → additional_data.superid
download_attachment将任意经过身份验证的附件下载到磁盘——可使用绝对 URL,或使用 get_timeline 返回的相对 /elearning/… 键;拒绝学校/登录页面(默认保存到 <tempdir>/homework,绝不覆盖文件)✅ 磁盘
get_timetable_changes指定日期的代课/课表变更
get_missing_teachers指定日期缺席的教师
get_day_summary一次调用生成指定日期的日报(课表、代课、教师、成绩、餐食,包括已发布的早餐/晚餐、作业、任务、缺勤、新闻、活动、通知);按姓名/ID 查询学生(识别角色)。优先发现:未提供 name/student_id 的家长会获得按学校分类的轻量级学生索引(mode:"discovery");传入 full=True 可为每个孩子生成完整报告。包含 school-day-summary Agent 技能(通过 edupage-mcp-full install-skill 安装),用于生成易读内容。
get_meals餐食菜单(全部 5 个时段:早餐、点心、午餐、下午点心、晚餐)
choose_meal订餐✅
sign_off_meal取消已订餐食✅
rate_meal评价餐食(质量/数量)✅
get_roster一次指定一个 roster_type=:students(登录用户的班级)、all_students(全校学生的简短名单)、teachers、classes、classrooms、subjects(原为 get_students、get_all_students、get_teachers、get_classes、get_classrooms、get_subjects)
get_my_students登录账户可查看的学生(单所学校)
find_student按姓名查找学生的 person_id(跨学校查询)
scan_students自动发现配置的 EDUPAGE_SUBDOMAINS 中的学生(若未设置,则搜索所有已登录学校)
clear_student_cache清除缓存的学生名单(单所或所有学校)✅ 缓存
get_subdomains可用的学校子域名 + 每所学校的角色/会话
send_message向用户发送消息✅
switch_to_student按 ID 或姓名切换到学生账户(仅限家长)✅ 会话
switch_to_parent切换回家长账户✅ 会话
custom_request通过当前会话发送原始文本请求(GET/POST);拒绝二进制正文,并提示使用 download_attachment✅

数据与安全说明

  • 大多数工具都是只读的。标记为**写入?✅**的工具会修改 EduPage 状态(发送消息、订餐、切换账号)。请谨慎使用。
  • download_attachment 是唯一会写入本地磁盘的工具:它会将文件保存到 dest_dir(默认为 <tempdir>/homework),优先使用服务器 content-disposition 中的文件名,并追加 (1)、 (2)…… 而不会覆盖任何文件。如果内容是 HTML 登录页或错误页,则会拒绝保存, 而不是将其作为附件写入。
  • custom_request 仅返回文本:遇到二进制响应体时会拒绝返回,并提示使用 download_attachment;超过 60000 个字符的文本响应体会被截断,并明确返回 truncated: true。
  • get_timeline 中的 homework、assignments、absences、events 和 news 类别的数据来自时间线通知;如果学校不推送某些事件类型,这些类别 可能会返回空列表。
  • 上游将 get_missing_teachers 标记为实验性(它会解析替课页面的 HTML), 如果教师姓名不再匹配,就可能引发错误。
  • rate_meal 和订餐功能取决于学校是否发布了标识符匹配的菜单;并非所有学校都支持评分。
  • get_meals 会先尝试按学生查询的订餐端点(订餐和评分都需要此端点)。如果学校未启用该端点, 则会回退到学校的公共食堂菜单小组件(/menu/?wid=menu_CanteenMenu_1)。 始终会返回全部五个时段(breakfast/snack/lunch/afternoon_snack/dinner);学校未发布的 时段会返回 None。

技能

此软件包附带一个Agent 技能(school-day-summary)。它会教编码 Agent 如何将 get_day_summary JSON 转换为易读的每日学校报告——“昨天我的孩子们有什么情况?”

安装插件时会同时安装此技能和服务。 若要单独安装此技能:

# already installed with the server:
edupage-mcp-full install-skill

# ...or with nothing but uv:
uvx --from edupage-mcp-full edupage-mcp-full install-skill --agent copilot

每个受影响的 Agent 都会打印一行:

installed -> C:\Users\you\.copilot\skills\school-day-summary\SKILL.md
skipped (identical) -> /home/you/.claude/skills/school-day-summary/SKILL.md
skipped (exists, differs, use --force) -> /home/you/.agents/skills/school-day-summary/SKILL.md

之后请重启 Agent,使其加载此技能。

选项
选项效果
--agent {opencode,copilot,claude,agents,all}仅安装到指定 Agent。未指定时:安装到所有已存在的 Agent 目录。all 会强制安装到全部四个目录,并创建缺失的目录。
--print打印解析后的 SKILL.md 路径并退出——不写入任何内容。
--dry-run报告将要写入的内容,但不实际写入。
--force覆盖内容不同的现有 SKILL.md。
安装位置
--agent安装到
opencode~/.config/opencode/skills/
copilot~/.copilot/skills/
claude~/.claude/skills/
agents~/.agents/skills/ — 跨厂商通用位置(Copilot、Codex、Cursor 和 opencode 均支持此位置)

可以安全地重复运行:内容完全相同的文件会标记为 skipped (identical);内容不同的文件不会被修改,除非传入 --force,因此你在本地编辑过的技能绝不会被悄然覆盖。

想自己放置文件?运行 edupage-mcp-full install-skill --print 会打印已安装软件包中内置 SKILL.md 的准确路径。

其他 MCP 客户端(Claude、Cursor 或任何不支持技能系统的客户端)可以 直接调用 get_day_summary——它们会收到完整的结构化 JSON。格式化方式因客户端而异。 基础 MCP 协议没有技能概念(虽已规定 io.modelcontextprotocol/skills 扩展,但此服务尚未 实现),因此技能通过上面的插件和安装程序分发。有关所有安装方式,请参阅 docs/PLUGINS.md。


参与贡献

贡献者和维护者指南请参阅 CONTRIBUTING.md。

  • 贡献工作流和本地设置
  • 架构与实现细节
  • 发布流程(PyPI、GitHub Releases、GHCR)
  • CI 质量门禁与上游覆盖率漂移检查

限制

  • 非官方,且设计上以读取为主。 EduPage 随时可能更改其端点;可靠性最终取决于 edupage-api,而非此封装。
  • 不绕过 CAPTCHA。 如果 EduPage 在登录时显示 CAPTCHA,请先通过浏览器登录,然后使用 login method="session" 和由此获得的 PHPSESSID。
  • 双重身份验证需要人工交互(在设备上批准或提供验证码)。
  • 家长/教师账号仅在上游得到部分验证;某些家长方法只能尽力而为。
  • 身份验证会话的有效期与 MCP 服务进程的生命周期相同;重启客户端后需要重新登录。
  • 跨学校发现学生取决于是否已登录所有相关学校(通过 EDUPAGE_SUBDOMAINS、login_all 或重复调用 login)。如果没有登录某所学校,就无法发现该学生在该校的成绩。

支持

如果你喜欢这个项目,并希望支持它或提出功能需求,可以请我喝杯啤酒,让我放松一下,也许还能带来一些灵感 :-)

通过 PayPal 支持


许可证

MIT © Oliver Hrubý

本项目与 Ascora (EduPage) 无关联,也未获得其认可,亦未获得 edupage-api 作者的认可。EduPage 是其各自所有者的注册商标。

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。