National Chengchi University
Uedu Main Site
Explore Uedu
Student Console
Register as Member/Login
Research Informed Consent Center
Survey Center
Teacher Console
Course Setup
Support & Messages
Uptime Data

UeduGPTs

--

Jupyters

7

Local AI

--

Uedu Code

--

CISOSE26 Local AI Uedu Code UG26
政治大學 AQI 59 26°C PM2.5 15
AI Reply Desktop Notifications

Show a desktop notification when the AI TA finishes replying

Chat Message Notifications

Notify me when classmates post messages in the forum

Sound notification

Play an alert sound whenever there is a new notification

Uedu Agent API v1

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.

Does not read student data Each write can be dry run first Each change can be reverted Announcements are created as drafts only

Quick start

  1. Create a token under “My Agent Token” below, and select the required scope.
  2. Give the token to your Agent (via MCP configuration or HTTP header).
  3. Give instructions in natural language, for example: “Copy my course 1234 to 115-1, and dry run it for me first.”

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.

My Agent Token

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.

Course list, system prompt, mode toggles, topics, knowledge base list, discussion board, change log, export bundle
Change settings, attach Skills, add/delete knowledge base files, create a discussion board, copy to a new semester, import, and create announcement drafts. Teaching assistants can read only and cannot modify.
Returns only your own data: course list, assignment/quiz/survey/worksheet/AI task deadlines and whether they have been submitted, and the announcements currently shown. Excludes grades, conversations, and discussion board posts.

Loading...

Authorized applications (OAuth)

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...

Set up MCP in your Agent

One MCP server provides both teacher-side and student-side tools; any scope not granted will return SCOPE_DENIED.

Method 1: HTTP + browser authorization (no installation, no token copying, recommended)

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

  1. The tool reads Uedu's discovery data and automatically registers itself at /oauth/register; you do not need to apply for any keys.
  2. The browser opens the Uedu authorization page, lists the scope it requests, and prompts: “Is this a tool you started yourself?” If you are not signed in, it will first redirect to the login page.
  3. After clicking “Allow authorization,” you are returned to the tool and shown as connected.
  4. If you say “use whoami to check my identity” in the chat, it should return your account, auth_kind as oauth, and the authorized scope.

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

  • If the authorization page shows an error, check error and error_description in the address bar. A common cause is that the callback URL sent by the tool is outside the allowed range (only https, local localhost, or a tool-defined scheme is accepted).
  • If the tool returns SCOPE_DENIED: that scope was not selected during authorization; revoke and authorize again. Or that feature is available only to course owners and instructors, while TAs have read-only access.
  • If the tool returns UNAUTHENTICATED: the token has been revoked or expired and the tool did not renew it; simply authenticate again.
  • Claude Code can use /mcp to check connection status, re-authenticate, or remove it; removing the tool-side setting does not revoke the authorization on Uedu, so please revoke it under “Authorized apps.”
Method 2: HTTP + personal token (for tools or scheduled scripts that do not support OAuth)

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" }
Method 3: stdio (run on your own computer; local files can be uploaded)
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.

Method 4: call the HTTP API directly (OpenClaw, custom scripts, scheduling)
curl -H "Authorization: Bearer uedu_agent_xxxxxxxx" \
  "https://uedu.tw/api/agent/v1/student/tasks?days=7"

What teachers can do

ToolsEndpointDescription
whoamiGET /meToken owner and scope
list_my_classroomsGET /classroomsCourses and channels I manage (owner/instructor/TA)
get_classroomGET /classrooms/{id}Full settings: system prompt, mode, topic, rag_mode, and visibility
update_classroom_settingsPATCH /classrooms/{id}Only modify the fields that are passed in; return {field: {from, to}}; dry_run is enabled by default
list_setting_changesGET /classrooms/{id}/changesAudit log: who, when, what was changed, and whether it was changed by the Agent
revert_setting_changePOST /classrooms/{id}/changes/{cid}/revertRestore fields to the values before a specific change
list_my_skillsmount_skillunmount_skill/skills/classrooms/{id}/skillsAttach approved Skills; a personal channel automatically uses all Skills of the owner
list_knowledgeadd_knowledge_textupload_knowledge_filedelete_knowledge/classrooms/{id}/knowledgeChannel knowledge base: processed in the background after upload; status can be checked
list_forum_boardscreate_forum_boardupdate_forum_board/classrooms/{id}/forum/boardsDiscussion board, including anonymous mode off/optional/forced
list_announcementscreate_announcement_draft/classrooms/{id}/announcementsFor official courses only; creates drafts only
export_classroomGET /classrooms/{id}/exportConfigure a bundle (JSON), which can be stored in git
copy_classroomPOST /classrooms/{id}/copyCopy to a new semester: settings + topics + Skills + knowledge base (reuse embeddings) + discussion board structure; excludes students, posts, and conversations
import_classroomPOST /classrooms/importRebuild 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.

What students can do

ToolsEndpointDescription
list_my_coursesGET /student/coursesCourses and channels I joined as a student
get_my_upcoming_tasksGET /student/tasks?days=14All due items for enrolled courses: assignments, quizzes, surveys, worksheets, AI tasks, and presentation sessions; including whether submitted, whether overdue, and hours remaining
get_my_announcementsGET /student/announcementsCurrently 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.

Reminder: your Agent will send this data to the model provider you choose (Anthropic, OpenAI, etc.). This is your own data, authorized by you; do not select scopes you do not need.

Design Principles

Do not access student data. The teacher scope only accesses the teacher’s own settings and course materials. Rosters, submission status, grades, discussion board posts, and AI conversation records are all excluded from this API; those require another consent mechanism and are not included in the first version.
Review before making changes. Every write endpoint supports dry_run and returns what would change; MCP tools have dry_run enabled by default, and the Agent should show the diff before executing.
Every change is logged and can be reverted. Configuration changes are recorded by a database trigger with the old and new values, and the source is tagged with the token; /changes can be queried and /revert can restore.
Content visible to students is published only when the teacher personally clicks Publish. Announcements can only be created as drafts.
Teaching assistants are read-only. classroom:write applies only to course owners and instructors. Discussion board management follows the existing discussion forum rules.
Separate from Public API v1. v1 is for publicly exposed, low-sensitivity data; the Agent API is for your own authorized data. The tokens are not interchangeable.

Response format and error codes

{ "success": true, "data": {...}, "message": "..." }
{ "success": true, "items": [...], "total": 12 }
{ "success": false, "error": "...", "error_code": "SCOPE_DENIED" }
  • UNAUTHENTICATED (401) — Token missing, invalid, revoked, or expired
  • SCOPE_DENIED (403) — Token does not have this scope; the response includes required_scope
  • PERMISSION_DENIED (403) — Not an instructor for this course, or a teaching assistant attempted to write
  • VALIDATION (400) — Invalid field content; the response explains the reason
  • RATE_LIMITED (429) — 120 requests per minute and 5,000 requests per day per token