Show a desktop notification when the AI TA finishes replying
Notify me when classmates post messages in the forum
Play an alert sound whenever there is a new notification
Use RESTful API to access public Courses and school data on the Uedu platform. All requests require API key authentication.
Sample exchange · fields follow the v1 documentation
Public API v1 only provides public data. If you want Claude Code, Codex, Cursor, or OpenClaw to help you change course settings, upload a knowledge base, duplicate a course to a new semester, or send assignment reminders for students, please use the personally authorized Agent API and MCP.
Go to Agent API and MCPAuthorization: Bearer <your_api_key>curl -H "Authorization: Bearer uedu_xxxxxxxx" \
https://uedu.tw/api/v1/universities
All /api/v1/* endpoints (except the root path) require an API key. Please use the HTTP header:
Authorization: Bearer <your_api_key>
Once the key is created, it will be shown in full only once; please copy and store it immediately. The database stores only the SHA-256 hash; if it is lost, it must be re-created.
If you need a higher quota, please contact the platform administrator.
GET /api/v1/universitiesRetrieve the university list.
Query parameter:
region — (optional) filter regionGET /api/v1/coursesRetrieve the public course list (only courses with is_public=1).
Query parameter:
university — (optional) school code or Chinese namesemester — (optional) semester, e.g. 114-2q — (optional) course title keywordspage — Default 1page_size — Default 20, maximum 100GET /api/v1/courses/<course_id>Retrieve single public course details, including course objectives and teaching content.
GET /api/v1/course_statsStatistics for publicly offered courses over the years, which can be grouped by semester, year or school (excluding personal data).
Query parameter:
university — (optional) school code or Chinese namegroup_by — semester | year | school(Default semester)GET /api/v1/papersList of academic papers published by the Uedu team (findings from teaching practice research).
Query parameter:
category — (optional) paper typeyear — (Optional) YearGET /api/v1/conferencesList of international conferences for academic exchange at Uedu. The relationship field distinguishes between: participated, conferences where the team has already published papers, delivered invited talks or won competition awards; watching, conferences the team continues to monitor and plans to submit to in future, with no participation record yet.
GET /api/v1/environment/schools/<school_ref>A snapshot of the latest environmental data for a single school, integrating government open data (Taiwan: CWA weather + MoEnv air quality; the United States: NWS/NOAA weather + US EPA AirNow air quality), aggregated to the school location using IDW top-3 weighting. Returns live air quality + daily aggregates (PM2.5/PM10/AQI/temperature/humidity/rainfall). Actual sources are shown in data_sources in the response.
The daily boundary for the daily summary is based on the 'local time zone of the institution' (for example, a school in Boston = Eastern Time 00:00–24:00), field date_local; date_taipei is a historical alias with the same value, retained only for compatibility. The AQI for schools in the United States follows the US EPA standard; it uses the same colour banding as Taiwan's Environmental Protection Administration AQI grading, but the calculation differs and they must not be compared directly.
Path parameter:
school_ref — School ID (number) or school code (e.g. NCU, NTU; case-insensitive)GET /api/v1/environment/schools/<school_ref>/historyHistorical daily aggregated environmental data for a single school, for trend analysis and learning inquiry.
Query parameter:
days — Lookback days, 1–90, default 30GET /api/v1/environment/snapshotThe latest environment snapshot from multiple schools, for cross-school comparison and region-based querying.
Query parameter:
region — (optional) filter region, e.g. "Taoyuan City" "Taipei City"limit — Maximum number of returned items, 1–100, default 30GET /api/v1/hub/packsBrowse UeduHub's publicly available teaching design Packs (skills, channel templates, question banks, surveys, AI tasks), including Teaching Card metadata and community statistics.
Query parameter:
q — (optional) name / summary / subject keywordsasset_type — skill | channel_template | quiz_bank | survey_bank | ai_taskeducation_level — university | high_school | junior_high | elementary | generalsort — recent | stars | installs(Default recent)limit — Maximum number of returned items, 1–100, default 30GET /api/v1/hub/packs/<pack_id>Single public Pack details: README, Teaching Card, and a summary of versions that have passed safety checks. Does not include the content itself (please install via the platform website).
The following are all data fields exposed externally by Public API v1 and MCP. All fields are low-sensitivity information at the "public timetable level"; sensitive data will never be exposed through this API.
/universitiesid、code、name_zh、name_en、short_name、region/coursesIncludes only courses that the Instructor has explicitly set as "public" (is_public=1)
id、class_name、course_number、course_classcourse_name_chinese、course_name_englishinstructor、instructor_englishdepartment、department_english、schoolsemester、start_date、end_date/courses/<id>Includes all the above fields, plus:
teaching_goal、teaching_goal_englishteaching_content、teaching_content_englishclass_memo/course_statskey(Term / year / school)、course_count、instructor_count/papersslug、title、title_zh、authors、conference、year、doi、category、uedu_feature、award/conferencesslug、name、name_short、year、dates、location、website、organizer、indexing、relationship、paper_count/environment/schools/<ref>、/environment/schools/<ref>/history、/environment/snapshotSource: government open data — Taiwan CWA Central Weather Administration (1,215 weather stations) + MoEnv Ministry of Environment (84 real-time air-quality stations); US NWS/NOAA + US EPA AirNow. Aggregated to school level using IDW top-3 weighting. The data are public government observations and contain no student or personal information.
id、code、name_zh、short_name、region、timezoneaqi、aqi_status、pm25_ugm3、observed_at_utcdate_local(date_taipei Historical alias for same value)、temp_c_avg/min/max、rh_avg、precip_total_mm、pm25_avg、pm10_avg、aqi_avgday_boundary = "school local timezone"—— Daily aggregation (especially cumulative rainfall) uses 00:00 in the school's local time zone to roll over the day, and does not change according to the querier's time zone/hub/packs、/hub/packs/<id>Includes only teaching design Packs that the publisher has explicitly set as "public" and that have passed safety checks.
id、name、summary、readme_md、asset_type、latest_versionsubject、education_level、bloom_levels、difficultystar_count、install_count、owner_name(Publisher display name)All responses are JSON, standard structure:
// Success
{ "success": true, "data": {...} }
{ "success": true, "items": [...], "page": 1, "page_size": 20, "total": 150 }
// Failed
{ "success": false, "error": "..." }
requests)# pip install requests
import requests
API_KEY = "uedu_xxxxxxxx"
BASE = "https://uedu.tw/api/v1"
headers = {"Authorization": f"Bearer {API_KEY}"}
# 1. List universities
r = requests.get(f"{BASE}/universities", headers=headers)
print(r.json())
# 2. Search Courses
r = requests.get(f"{BASE}/courses", headers=headers, params={
"university": "ncu",
"semester": "114-2",
"q": "Artificial intelligence",
"page": 1,
"page_size": 20,
})
data = r.json()
for course in data["items"]:
print(course["id"], course["class_name"], course["instructor"])
# 3. Get course details
r = requests.get(f"{BASE}/courses/123", headers=headers)
print(r.json()["data"])
# Error handling
if r.status_code == 401:
print("API key invalid or revoked")
elif r.status_code == 429:
print("Rate limit exceeded, please try again later")
elif r.status_code == 404:
print("Resource not found")
fetch)const API_KEY = "uedu_xxxxxxxx";
const BASE = "https://uedu.tw/api/v1";
const headers = { "Authorization": `Bearer ${API_KEY}` };
// Search Courses
const params = new URLSearchParams({
university: "ncu",
semester: "114-2",
page: 1,
page_size: 20,
});
const res = await fetch(`${BASE}/courses?${params}`, { headers });
if (!res.ok) {
if (res.status === 401) throw new Error("API key invalid");
if (res.status === 429) throw new Error("Rate limit");
throw new Error(`HTTP ${res.status}`);
}
const data = await res.json();
console.log(data.items);
We provide an MCP (Model Context Protocol) server, allowing you to query Uedu's public data directly in tools that support MCP, such as Claude Desktop, Claude Code, Cursor and VS Code, using natural language, with no programming required at all.
Download uedu_mcp_server.py and install dependencies:
pip install "mcp[cli]" httpx
# Download server script
curl -O https://uedu.tw/static/mcp/uedu_mcp_server.py
Claude Desktop
Edit configuration file:
~/Library/Application Support/Claude/claude_desktop_config.json%APPDATA%\Claude\claude_desktop_config.json{
"mcpServers": {
"uedu": {
"command": "python",
"args": ["/absolute/path/to/uedu_mcp_server.py"],
"env": {
"UEDU_API_KEY": "uedu_xxxxxxxx"
}
}
}
}
After saving, restart Claude Desktop for the changes to take effect.
Claude Code (CLI)
Use built-in commands to add quickly:
claude mcp add uedu \
--env UEDU_API_KEY=uedu_xxxxxxxx \
-- python /absolute/path/to/uedu_mcp_server.py
Cursor
Edit ~/.cursor/mcp.json (global) or within the project .cursor/mcp.json:
{
"mcpServers": {
"uedu": {
"command": "python",
"args": ["/absolute/path/to/uedu_mcp_server.py"],
"env": {
"UEDU_API_KEY": "uedu_xxxxxxxx"
}
}
}
}
You can also add it graphically on Cursor's "Settings → MCP" page.
VS Code (native MCP support)
VS Code has built-in MCP support (not limited to Copilot Chat). Three ways to add it:
MCP: Add Server, complete according to the guided flowMCP: Open User Configuration Edit user mcp.json.vscode/mcp.json{
"servers": {
"uedu": {
"type": "stdio",
"command": "python",
"args": ["${workspaceFolder}/uedu_mcp_server.py"],
"env": {
"UEDU_API_KEY": "uedu_xxxxxxxx"
}
}
}
}
macOS / Linux users are advised to enable sandboxing, restricting the server to access only Uedu domains:
{
"servers": {
"uedu": {
"type": "stdio",
"command": "python",
"args": ["${workspaceFolder}/uedu_mcp_server.py"],
"env": { "UEDU_API_KEY": "uedu_xxxxxxxx" },
"sandboxEnabled": true,
"sandbox": {
"filesystem": { "allowWrite": [] },
"network": { "allowedDomains": ["uedu.tw"] }
}
}
}
}
At first launch, VS Code will show a “Trust this server” dialogue; once you confirm, you can use it. The Continue extension can also be configured with the same server block.
We also provide an MCP server using streamable-http transport. On the client side, you only need to enter the URL and API key in the configuration file, with no need to install Python or any dependencies locally. Suitable for users without an engineering background.
VS Code .vscode/mcp.json:
{
"servers": {
"uedu": {
"type": "http",
"url": "https://uedu.tw/mcp",
"headers": {
"Authorization": "Bearer uedu_xxxxxxxx"
}
}
}
}
Cursor / Claude Desktop(version that supports http transport):
{
"mcpServers": {
"uedu": {
"url": "https://uedu.tw/mcp",
"headers": {
"Authorization": "Bearer uedu_xxxxxxxx"
}
}
}
}
Once set up, simply ask in the conversation:
The LLM automatically calls the corresponding MCP tool, returns the result, and summarises it in natural language.