Waseda Moodle MCP
The MCP server can be hosted as a Cloudflare Worker, enabling a web console and serverless operation.
Provides a secret ICS subscription URL for assignments, deadlines, and timetable, allowing integration with Google Calendar.
Connects to Waseda University's Moodle instance, providing tools to retrieve assignments and deadlines, timetable, syllabus details, grades, course content, forum posts, messages, notifications, and files. It also supports writing operations such as assignment submission, forum posts, and sending messages, with a preview and confirm step.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Waseda Moodle MCPWhat assignments are due this week that I haven't submitted yet?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Waseda Moodle MCP
Connect Waseda University Moodle (wsdmoodle) to Claude, ChatGPT, Cursor and other AI assistants. Assignments & deadlines, timetable, syllabus, grades and course updates — just ask.
Public instance · Self-hosting · MIT License
An MCP (Model Context Protocol) server for Waseda University's Moodle
(https://wsdmoodle.waseda.jp). Ask your AI assistant what is due this week, when and where your
next class is, how a course is graded, or what teachers posted recently — across every course at once.
It is Waseda-only by design: the Moodle origin, the login flow and several features (syllabus-based
timetable, assignments & deadlines sweep) are specific to that site.
It runs either as a hosted service on Cloudflare Workers (with a web console) or as a local stdio process. Unofficial; not affiliated with Waseda University.
Ask things like
"What assignments are due this week? Which ones have I not submitted?"
"What classes do I have tomorrow, and in which rooms?"
"How is Introduction to Data Science graded?"
"What did teachers add to my courses since Monday?"
Screenshots
Overview | Assignments & deadlines |
My courses | Timetable |
Screenshots use fictional demo data.
Related MCP server: mcp-moodle
Features
Assignments & deadlines
Outstanding items grouped Overdue / Today / Tomorrow / Next 7 days / Later, or by course (
group_by=course). Submitted items stay in their group struck through. From the Moodle calendar plus a background sweep that finds undated activities and deadlines written in course text (marked "verify").Recent teacher additions and changes in your courses.
Calendar feed: a secret ICS subscription URL (console Settings → Calendar feed) for assignments & deadlines and the timetable in Google Calendar, Apple Calendar or Outlook.
Timetable
Per-day classes with times, room and campus, built from the public Waseda syllabus and the academic calendar. On-demand and unknown slots listed separately.
Courses, content and grades
Enrolled courses (this term by default), a confirmed course selection (Settings → This term's courses), course sections and activities, activity details, name search across courses, grades per course.
Forums, messages and notifications
Forum threads and posts, Moodle conversations, notifications with unread counts.
Files
Download any Moodle file through a short-lived signed URL (hosted) or a temp file (stdio); small files can be attached inline.
Writes with preview, then confirm
Assignment submission (text and files), forum posts and replies, Moodle messages, manual completion.
Every write is two steps:
prepare_*returns a preview, and nothing reaches Moodle untilconfirm_actionruns after you agree. Writes can also be restricted to approval in the web console, or turned off.
How it works
The server talks to Moodle's web services using the same token the official Moodle mobile app uses. That token is obtained from Moodle's mobile-app launch flow while you are signed in to Moodle in your browser; your password is never requested or seen.
AI client <-- MCP (HTTP or stdio) --> MCP server (Worker / Node) <-- REST --> Moodle web services
|
D1 / KV (hosted)Quick start
Public instance — operated by Konata, free:
Open the public instance and connect Moodle with the bookmarklet, the browser extension, or by pasting the launch link. Your password is never asked for.
Optionally confirm this term's courses under Settings → This term's courses.
Copy the MCP URL from Settings → AI clients and add it to your AI client (see Clients).
Your own instance — see Self-hosting. Below, https://wasemoodle.example.com stands
for your instance URL.
Console
The hosted console sidebar: Overview, Assignments & deadlines, My courses, Timetable, Approvals, Settings.
My courses is the per-course view (tasks, timetable, syllabus grading, recent updates). Confirm which courses you attend under Settings → This term's courses.
Settings tabs: General, This term's courses, AI clients, API keys, Authorized apps, Calendar feed, Activity, Account.
Clients
MCP URL: https://wasemoodle.example.com/mcp (Streamable HTTP). OAuth is the default: the client
discovers the authorization server from the 401 response (RFC 9728), registers itself and opens
the consent page, where you grant read-only or read+write access. API keys (wmm_…, created on the
console Settings → API keys) are for clients that can send an Authorization: Bearer <API_KEY> header.
The console Settings → AI clients page shows the same steps with your instance URL filled in.
Client | Setup |
Claude (web, Desktop; usable on mobile once added) | Customize → Connectors → Add custom connector → URL → Connect. Free plan: 1 custom connector; Team/Enterprise: an Owner adds it in Organization settings → Connectors. |
ChatGPT | Plugins → + → Add custom MCP server → URL, Authentication OAuth → Create. Available on Plus, Pro, Business, Enterprise and Edu. |
Grok | grok.com/connectors → New Connector → Custom → URL. Business/Enterprise: admin adds it first at console.x.ai. |
Claude Code |
|
Cursor |
|
VS Code (Copilot) |
|
Codex CLI |
|
Gemini CLI |
|
Grok CLI |
|
Other (LobeHub, Cherry Studio, …) | Streamable HTTP + URL; OAuth if supported, otherwise the API-key header |
With an API key instead of OAuth. Keep the key out of project files: CLIs store it in your
user config, and Codex and Cursor read it from WMM_API_KEY (set it in your shell profile, e.g.
export WMM_API_KEY='<API_KEY>' in ~/.zshrc).
# Claude Code / Grok CLI (instead of the OAuth command; `claude mcp remove waseda-moodle` first if already added)
claude mcp add --transport http waseda-moodle https://wasemoodle.example.com/mcp \
--header "Authorization: Bearer <API_KEY>"
grok mcp add --transport http waseda-moodle https://wasemoodle.example.com/mcp \
--header "Authorization: Bearer <API_KEY>"
# Codex
codex mcp add waseda-moodle --url https://wasemoodle.example.com/mcp --bearer-token-env-var WMM_API_KEYCursor (~/.cursor/mcp.json): add "headers": { "Authorization": "Bearer ${env:WMM_API_KEY}" } to the
server entry. VS Code (.vscode/mcp.json): let VS Code prompt for the key and store it securely:
{
"inputs": [
{ "type": "promptString", "id": "wmm-api-key", "description": "Waseda Moodle MCP API key", "password": true }
],
"servers": {
"waseda-moodle": {
"type": "http",
"url": "https://wasemoodle.example.com/mcp",
"headers": { "Authorization": "Bearer ${input:wmm-api-key}" }
}
}
}Gemini CLI (~/.gemini/settings.json, use httpUrl): add
"headers": { "Authorization": "Bearer <API_KEY>" } to the server entry. ChatGPT and Claude
(web) use OAuth only.
Local stdio (Node 20+):
pnpm install
pnpm build:stdio # produces dist/stdio.js
node dist/stdio.js connect - # paste the launch link on stdinClient configuration (JSON form used by most clients):
{
"mcpServers": {
"waseda-moodle": {
"command": "node",
"args": ["/path/to/waseda-moodle-mcp/dist/stdio.js"]
}
}
}Or with Claude Code: claude mcp add waseda-moodle -- node /path/to/dist/stdio.js --read-only.
Option | Meaning |
| Register read tools only |
| Token or launch link; overrides the token file |
| Config directory (default |
| Outbound proxy settings |
Stdio stores the token in plain text (file mode 0600) and does not support console approval
of writes or create_upload_link.
Tools
Tool | Purpose | Access |
| Assignments and deadlines grouped by day or by course ( | read |
| Enrolled courses ( | read |
| Sections and activities of one course | read |
| Search activity, section and file names | read |
| Full details of one activity | read |
| Grades for a course | read |
| Save the course selection (This term's courses; server-side filter; does not change Moodle) | read scope |
| Recent teacher changes | read |
| Classes per day with room and campus | read |
| Set or clear a course's class time (server-side; does not change Moodle) | read scope |
| Public syllabus: plan, grading weights, textbooks | read |
| Review a finished quiz attempt (questions, marks, right answers) | read |
| Fetch a Moodle file (signed URL, temp file, or inline up to 1 MiB) | read |
| Forum threads (default: announcements) | read |
| Posts of one discussion | read |
| Moodle conversations | read |
| Messages of one conversation | read |
| Notifications and unread count | read |
| Keyword search over forum discussions (optionally messages) | read |
| Find teachers and classmates seen in your course forums or conversations | read |
| Short-lived upload URL for large files (hosted only) | write |
| Preview an assignment submission | write |
| Preview a forum post or reply | write |
| Preview a Moodle message | write |
| Preview marking an activity done / not done | write |
| Preview subscribing to / unsubscribing from a forum | write |
| Preview marking notifications or a conversation as read | write |
| Execute a prepared action | write |
| Discard a prepared action | write |
Prompts: daily_briefing (optional date), weekly_plan, exam_prep (course). Resources: moodle://course/{course_id}
and moodle://syllabus/{course_id}. Prepared actions expire after 30 minutes. Times
are shown in JST. The server never takes quizzes.
Security and privacy
No Moodle password is ever requested. The Moodle token is encrypted at rest (AES-256-GCM with the operator's
MASTER_KEY).File contents are streamed, not stored. Download and upload links are HMAC-signed and expire in 15 and 30 minutes.
API keys are stored as hashes. OAuth access tokens last 12 hours, refresh tokens 90 days.
Deleting your account under Settings → Account removes all of your data on the server.
Details: docs/privacy.md.
Self-hosting
The hosted variant fits the Cloudflare Workers Free plan (Worker + D1 + KV + static assets). See docs/self-hosting.md.
Development
Command | Purpose |
|
|
| Vitest (core, worker, node, extension) |
| Console tests |
| TypeScript, root and |
| Biome |
| jscpd duplication / knip dead code |
| lint + dup + dead + typecheck (tests run separately) |
| Bundle the stdio server |
Layout: src/core (runtime-agnostic services, Moodle client, MCP tools), src/worker
(Cloudflare entry, OAuth, API, D1 store, cron), src/node (stdio CLI), web (React console),
extension (MV3 connector, no build step), migrations (D1 SQL), tests.
License
MIT.
Disclaimer
This is an unofficial project and is not affiliated with or endorsed by Waseda University. The Moodle token it uses is the same token the official Moodle mobile app uses (one per user). This server never revokes or resets it; if Moodle rejects it, the server simply asks you to reconnect.
This server cannot be deployed
Maintenance
Related MCP Connectors
Connect your Moodle to AI assistants: courses, content, grading and reports from the chat.
Mac & Windows: let ChatGPT, Claude & Cursor use your email, calendar, iMessage, Teams, files.
Create, edit, translate, and export SCORM eLearning modules from a connected AI assistant.
Manage WordPress blogs and WooCommerce shops from Claude, ChatGPT, Cursor and other MCP apps.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceProvides Claude with full access to Moodle learning management systems, enabling interaction with courses, files, assignments, grades, and calendar events. It also supports building Obsidian study vaults from course materials through automated knowledge graph creation.20 npm18MIT
- AlicenseAqualityCmaintenanceEnables AI assistants to interact with Moodle via web services, allowing tasks like listing courses, assignments, events, and downloading files.1033 PyPI4MIT
- FlicenseNot gradedqualityDmaintenanceEnables AI assistants to read your Moodle courses, list materials, quizzes, and search content to plan exam preparation through natural language.1-
- FlicenseNot gradedqualityCmaintenanceEnables AI agents to interact with Moodle LMS, fetching assignments, grades, deadlines, course content, and syncing to Obsidian, with WhatsApp alerts and class-slot filtering.-