moodle-student-mcp
llms.txt0 starsChanged 30 days agoMITView on GitHub
Moodle MCP server for students. A Model Context Protocol MCP server that gives AI apps like Claude, ChatGPT and Cursor read only access to Moodle courses: assignments, due dates, grades, announcements and course content. Free, open source, read only. It cannot submit, edit or delete anything. Every tool is listed below with its parameters and one example call. Example calls are JSON in the MCP tools/call shape: the tool name plus its arguments.
The file
We split this llms.txt into the rules it gives an agent
3 rules. About 0 are common, 2 are distinctive, and 1 is very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈2
Distinctive · estimate
This author's own choices. Worth a look.
1
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 8
If a tool reports Not signed in, Access denied or Web services not enabled, the message says what to change.
- Very specific: line 9
Run with npx -y moodle-student-mcp.
- Distinctive: line 13
Every tool is listed below with its parameters and one example call.
≈ “Common” is an estimate: at least 1 in 5 of the 3,592 llms.txt files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
# moodle-student-mcp
> Moodle MCP server for students. A Model Context Protocol MCP server that gives AI apps like Claude, ChatGPT and Cursor read only access to Moodle courses: assignments, due dates, grades, announcements and course content. Free, open source, read only. It cannot submit, edit or delete anything.
## Setup
- Needs MOODLE_BASE_URL and MOODLE_TOKEN.
- Copy the Moodle mobile web service key from Preferences, User account, Security keys.
- If a tool reports Not signed in, Access denied or Web services not enabled, the message says what to change.
- Run with npx -y moodle-student-mcp. Run `npx moodle-student-mcp doctor` to check the setup.
## Tools (all read only)
Every tool is listed below with its parameters and one example call. Example calls are JSON in the MCP tools/call shape: the tool name plus its arguments.
### get_my_courses
Lists your current courses with the ID other tools take as course_id. Hides finished and hidden courses.
Parameters: none.
Example call: `{"name":"get_my_courses","arguments":{}}`
### get_upcoming_due_dates
Lists up to 50 items due in the next 60 days across your courses that still need action, soonest first, with the course name and due date. Plain course events such as 'Course starts' and 'Course ends' are left out because there is nothing to do about them.
Parameters: course_ids (optional, array of course IDs from get_my_courses to limit the list, string or number items; leave it out to cover all current courses).
Example call: `{"name":"get_upcoming_due_dates","arguments":{"course_ids":[11]}}`
### get_overdue
Lists past due items from the last 45 days that still need action, with the course name and the date each was due.
Parameters: course_ids (optional, array of course IDs from get_my_courses to limit the list, string or number items; leave it out to cover all current courses).
Example call: `{"name":"get_overdue","arguments":{"course_ids":[11]}}`
### get_calendar
Lists up to 50 calendar events from start_date to end_date, both included, oldest first, with the course name and date. It works for any dates, past or future, and also shows events that need no action. The window can span up to 366 days.
Parameters: start_date (required, YYYY-MM-DD, in the time zone of the computer running the server), end_date (required, YYYY-MM-DD, that day is included), course_ids (optional, array of course IDs from get_my_courses to limit the list, string or number items).
Example call: `{"name":"get_calendar","arguments":{"start_date":"2026-12-01","end_date":"2026-12-07"}}`
### get_todo
One digest for what to do next across your courses: overdue work, work due soon, assignments with no due date, and the latest announcement subjects, each with the course name and due date. Submission status comes from the assignment list and the calendar adds quizzes and other activities. Announcements are the latest subjects from the last 7 days.
Parameters: course_ids (optional, array of course IDs from get_my_courses to limit the digest, string or number items; leave it out to cover all current courses), days_ahead (optional, how many days ahead to look, default 14), overdue_days (optional, how many days back to include overdue work, default 14).
Example call: `{"name":"get_todo","arguments":{"course_ids":[11],"days_ahead":14,"overdue_days":14}}`
### get_assignments
Lists up to 25 assignments for one course with due dates and submission status: not submitted, draft, submitted or graded.
Parameters: course_id (required, Moodle course ID from get_my_courses, string or number).
Example call: `{"name":"get_assignments","arguments":{"course_id":11}}`
### get_assignment_details
Shows the due date, the instructions and the attached files of the assignments in one course, up to 5 at a time. Each attached file shows its name and a link with your key removed, ready for get_file.
Parameters: course_id (required, Moodle course ID from get_my_courses, string or number), assignment_name (optional, part of an assignment name to pick one; leave it out to read the first assignments by due date).
Example call: `{"name":"get_assignment_details","arguments":{"course_id":11,"assignment_name":"Lab 3"}}`
### get_quizzes
Lists up to 25 quizzes for one course with the open and close dates, the time limit, the attempts used and allowed, and your best grade.
Parameters: course_id (required, Moodle course ID from get_my_courses, string or number).
Example call: `{"name":"get_quizzes","arguments":{"course_id":11}}`
### get_missing_work
Lists the assignments in your courses that you have not handed in yet, with the course name and the due date. Drafts that were never handed in are included, and work that was already handed in or graded is left out. Up to 25 assignments in each course are checked and the list holds up to 50 items.
Parameters: course_ids (optional, array of course IDs from get_my_courses to limit the list, string or number items; leave it out to cover all current courses).
Example call: `{"name":"get_missing_work","arguments":{}}`
### get_my_grades
Shows the posted overall grade for every current course, or "no grade posted yet".
Parameters: none.
Example call: `{"name":"get_my_grades","arguments":{}}`
### get_course_grade_items
Lists every graded item for one course with the mark and percentage, including the course total when there is one.
Parameters: course_id (required, Moodle course ID from get_my_courses, string or number).
Example call: `{"name":"get_course_grade_items","arguments":{"course_id":11}}`
### get_course_content
Lists the sections of one course, such as weeks or topics, with up to 40 activities in each, such as pages, quizzes and forums. Each activity shows its intro text when there is one, such as assignment instructions, label text or a page summary. Each file shows its name and a link with your key removed, ready for get_file.
Parameters: course_id (required, Moodle course ID from get_my_courses, string or number).
Example call: `{"name":"get_course_content","arguments":{"course_id":11}}`
### get_course_page
Reads the Page activities of one course, the pages listed as page in get_course_content, and returns their text with the HTML removed. Up to 5 pages are shown, each up to 20000 characters. Images and embedded media are not shown.
Parameters: course_id (required, Moodle course ID from get_my_courses, string or number), page_name (optional, part of the page title to pick one page; leave it out to read the first pages).
Example call: `{"name":"get_course_page","arguments":{"course_id":11,"page_name":"Week 1"}}`
### get_file
Downloads one course file resource, such as a PDF, slide deck or handout, from its file_url. Plain text and HTML files come back as readable text. A PDF with readable text comes back as text, and a PDF with no extractable text comes back with its file name, a link with your key removed and a note to open it in Moodle. Any other file type is not supported and comes back with its file name, a link with your key removed and a note that only plain text, HTML and PDF are supported, with a note to open it in Moodle. Only a link on your school's Moodle site is downloaded, so your key is never sent to another server. A link that points somewhere else is refused.
Files over 25 MB are not downloaded; the answer gives their name and link instead.
Parameters: file_url (required, URL of the course file to download, string).
Example call: `{"name":"get_file","arguments":{"file_url":"https://moodle.example.edu/webservice/pluginfile.php/1/mod_resource/content/0/slides.pdf"}}`
### get_announcements
Lists the latest news forum posts with subject, course name and text, up to 5 posts from each of up to 10 news forums. A course or forum the school server will not open is left out and the rest still shows.
Parameters: course_ids (optional, array of course IDs from get_my_courses to limit the search, string or number items; leave it out to cover all current courses).
Example call: `{"name":"get_announcements","arguments":{"course_ids":[11]}}`
### get_forum_discussions
Lists the latest discussions in the forums of one course, with subject, author, date, reply count and the start of the text, up to 5 discussions from each of up to 5 forums. Announcement forums are left out, use get_announcements for those. A forum the school server will not open is named at the end and the rest still shows.
Parameters: course_id (required, Moodle course ID from get_my_courses, string or number), forum_name (optional, part of a forum name to pick one forum; leave it out to read the first forums).
Example call: `{"name":"get_forum_discussions","arguments":{"course_id":11,"forum_name":"Chat"}}`
### get_forum_posts
Reads one forum discussion with the first post and every reply, each with author, date and text, up to 50 posts of up to 2000 characters each.
Parameters: discussion_id (required, the number shown as discussion_id in get_forum_discussions, string or number).
Example call: `{"name":"get_forum_posts","arguments":{"discussion_id":5}}`
## Links
- Source and README, https://github.com/AnonymousOnyx22/moodle-student-mcp
- More free student MCP servers, https://brightspacemcp.com/more-mcps/
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

