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
Let your AI Agent operate Uedu for you. Teachers can use Claude Code, Codex, Cursor, or OpenClaw to edit the system prompt directly, upload knowledge base content, open a discussion board, and copy a course to a new semester; students can let the Agent read their own upcoming deadlines and announcements to provide assignment reminders.
Every Agent call is recorded; configuration changes on the teacher side are also written to the channel settings audit, so you can see which token made the change.
Token format uedu_agent_…; the database stores only a SHA-256 hash, and the full token is shown only once after creation. Each person can have up to 5 active tokens.
Loading...
When an OAuth-capable tool (Claude Code, Cursor, VS Code, etc.) connects for the first time, it will open a browser to the Uedu authorization page, so you do not need to copy a token. This lists the applications you have authorized, and you can revoke them at any time.
Loading...
One MCP server provides both teacher-side and student-side tools; any scope not granted will return SCOPE_DENIED.
Claude Code
claude mcp add --transport http uedu-agent https://uedu.tw/mcp/agent
# Then enter /mcp in the conversation, choose uedu-agent to authenticate, and the browser will open the Uedu authorization page
Cursor / VS Code / Claude Desktop
{ "mcpServers": { "uedu-agent": { "url": "https://uedu.tw/mcp/agent" } } }
What happens on the first connection
The access token lasts one hour and the refresh token lasts thirty days, and the tool will renew it automatically. This authorization will appear under “Authorized apps” above and can be revoked at any time; after revocation, the tool must be authorized again the next time it is used.
Troubleshooting
Claude Code
claude mcp add --transport http uedu-agent https://uedu.tw/mcp/agent \
--header "Authorization: Bearer uedu_agent_xxxxxxxx"
Cursor(~/.cursor/mcp.json)/ Claude Desktop
{
"mcpServers": {
"uedu-agent": {
"url": "https://uedu.tw/mcp/agent",
"headers": { "Authorization": "Bearer uedu_agent_xxxxxxxx" }
}
}
}
VS Code(.vscode/mcp.json)
{
"servers": {
"uedu-agent": {
"type": "http",
"url": "https://uedu.tw/mcp/agent",
"headers": { "Authorization": "Bearer uedu_agent_xxxxxxxx" }
}
}
}
Codex CLI(~/.codex/config.toml)
[mcp_servers.uedu_agent]
url = "https://uedu.tw/mcp/agent"
http_headers = { Authorization = "Bearer uedu_agent_xxxxxxxx" }
pip install "mcp[cli]" httpx
curl -O https://uedu.tw/static/mcp/uedu_mcp_agent.py
# Claude Code
claude mcp add uedu-agent --env UEDU_AGENT_TOKEN=uedu_agent_xxxxxxxx \
-- python /absolute/path/to/uedu_mcp_agent.py
The stdio mode includes an additional upload_knowledge_file tool, which can upload local PDF/DOCX/PPTX/TXT files directly to the knowledge base; in HTTP mode, use add_knowledge_text to send text.
curl -H "Authorization: Bearer uedu_agent_xxxxxxxx" \
"https://uedu.tw/api/agent/v1/student/tasks?days=7"
| Tools | Endpoint | Description |
|---|---|---|
whoami | GET /me | Token owner and scope |
list_my_classrooms | GET /classrooms | Courses and channels I manage (owner/instructor/TA) |
get_classroom | GET /classrooms/{id} | Full settings: system prompt, mode, topic, rag_mode, and visibility |
update_classroom_settings | PATCH /classrooms/{id} | Only modify the fields that are passed in; return {field: {from, to}}; dry_run is enabled by default |
list_setting_changes | GET /classrooms/{id}/changes | Audit log: who, when, what was changed, and whether it was changed by the Agent |
revert_setting_change | POST /classrooms/{id}/changes/{cid}/revert | Restore fields to the values before a specific change |
list_my_skills、mount_skill、unmount_skill | /skills、/classrooms/{id}/skills | Attach approved Skills; a personal channel automatically uses all Skills of the owner |
list_knowledge、add_knowledge_text、upload_knowledge_file、delete_knowledge | /classrooms/{id}/knowledge | Channel knowledge base: processed in the background after upload; status can be checked |
list_forum_boards、create_forum_board、update_forum_board | /classrooms/{id}/forum/boards | Discussion board, including anonymous mode off/optional/forced |
list_announcements、create_announcement_draft | /classrooms/{id}/announcements | For official courses only; creates drafts only |
export_classroom | GET /classrooms/{id}/export | Configure a bundle (JSON), which can be stored in git |
copy_classroom | POST /classrooms/{id}/copy | Copy to a new semester: settings + topics + Skills + knowledge base (reuse embeddings) + discussion board structure; excludes students, posts, and conversations |
import_classroom | POST /classrooms/import | Rebuild from a bundle; Skills are matched by name to your approved skills |
Base URL:https://uedu.tw/api/agent/v1。You can add ?dry_run=1 to write endpoints or set dry_run: true in the body.
| Tools | Endpoint | Description |
|---|---|---|
list_my_courses | GET /student/courses | Courses and channels I joined as a student |
get_my_upcoming_tasks | GET /student/tasks?days=14 | All due items for enrolled courses: assignments, quizzes, surveys, worksheets, AI tasks, and presentation sessions; including whether submitted, whether overdue, and hours remaining |
get_my_announcements | GET /student/announcements | Currently displayed published announcements (including content) |
Typical usage: schedule the Agent to call the daily_study_reminder prompt every morning, convert UTC time to local time, and prioritize overdue items.
{ "success": true, "data": {...}, "message": "..." }
{ "success": true, "items": [...], "total": 12 }
{ "success": false, "error": "...", "error_code": "SCOPE_DENIED" }
UNAUTHENTICATED (401) — Token missing, invalid, revoked, or expiredSCOPE_DENIED (403) — Token does not have this scope; the response includes required_scopePERMISSION_DENIED (403) — Not an instructor for this course, or a teaching assistant attempted to writeVALIDATION (400) — Invalid field content; the response explains the reasonRATE_LIMITED (429) — 120 requests per minute and 5,000 requests per day per token