Moodle MCP for Students
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| MOODLE_TOKEN | Yes | Your Moodle mobile web service token, found in Moodle under Preferences > User account > Security keys | |
| MOODLE_BASE_URL | Yes | The base URL of your school's Moodle site, e.g. https://moodle.yourschool.edu |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| get_my_coursesA | Answers 'what courses am I enrolled in?' Lists each current Moodle course with the ID other tools take as course_id. No input. Ask: 'Which courses do I have this term?' |
| get_upcoming_due_datesA | Answers 'what is due soon?' 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. Course events such as 'Course starts' and 'Course ends' are left out because there is nothing to do about them. Input: course_ids, an optional array of course IDs to limit the list; leave it out to cover all current courses. Ask: 'What's due in the next two weeks?' |
| get_overdueA | Answers 'is anything overdue?' Lists past due items from the last 45 days that still need action, with the course name and the date each was due. Input: course_ids, an optional array of course IDs to limit the list; leave it out to cover all current courses. Ask: 'Is anything overdue?' |
| get_calendarA | Answers 'what is on my calendar between these dates?' Lists up to 50 calendar events from start_date to end_date, both included, oldest first, with the course name and date. Unlike get_upcoming_due_dates and get_overdue it works for any dates, past or future, and also shows events that need no action. Input: start_date and end_date as YYYY-MM-DD, in the time zone of the computer running the server; course_ids, an optional array of course IDs to limit the list. The window can span up to 366 days. Ask: 'What is due the week of Dec 1?' |
| get_todoA | Answers 'what should I do today?' One digest across your courses that opens with a Start here line naming the most urgent item (the oldest overdue work, else the next thing due), then lists 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. Input: course_ids, an optional array of course IDs to limit the digest; days_ahead, how many days ahead to look, default 14; overdue_days, how many days back to look for overdue work, default 14. Ask: 'What should I do today?' |
| get_assignmentsA | Answers 'what do I still need to submit in this course?' Lists up to 25 assignments for one course with due dates and submission status: not submitted, draft, submitted or graded. Input: course_id, the ID from get_my_courses. Ask: 'Which assignments have I not submitted yet in Networking Basics?' |
| get_assignment_detailsA | Answers 'what does assignment X require?' 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. Input: course_id from get_my_courses, and an optional assignment_name, part of an assignment name, to pick one. Ask: 'What does the Lab 3 assignment in Networking Basics require?' |
| get_quizzesA | Answers 'when does my quiz open, how many attempts do I have left and what did I score?' 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. Input: course_id, the ID from get_my_courses. Ask: 'When does the quiz open in Networking Basics and how many attempts do I have left?' |
| get_missing_workA | Answers 'what do I still owe?' 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. Input: course_ids, an optional array of course IDs to limit the list; leave it out to cover all current courses. Ask: 'What work am I still missing?' |
| get_my_gradesA | Answers 'what's my grade in each course?' Shows the posted overall grade for every current course, or 'no grade posted yet'. No input. Ask: 'What's my grade in each course?' |
| get_course_grade_itemsA | Answers 'what's in the gradebook for this course?' Lists every graded item for one course with the mark and percentage, including the course total when there is one. Input: course_id, the ID from get_my_courses. Ask: 'Show me the gradebook for Networking Basics.' |
| get_course_contentA | Answers 'what's in this course?' 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 the course has one, such as assignment instructions, label text or a page summary. Each file shows its name and a link with your key removed, so the link is safe to show in a chat and get_file can still open it. Input: course_id, the ID from get_my_courses. Ask: 'What materials are posted in Networking Basics?' |
| get_course_pageA | Answers 'what does this course page say?' 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, and a longer page ends with [truncated]. Images and embedded media are not shown. Input: course_id, the ID from get_my_courses, and page_name, an optional word or phrase from the page title to pick one page; leave it out to read the first pages of the course. Ask: 'Read the Week 2 reading page in Networking Basics.' |
| get_announcementsA | Answers 'any new 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. Input: course_ids, an optional array of course IDs to limit the search; leave it out to cover all current courses. Ask: 'Any new announcements from my teachers?' |
| get_forum_discussionsA | Answers 'what are people discussing in the Networking Basics forum?' 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. Input: course_id from get_my_courses, and an optional forum_name, part of a forum name, to pick one forum. Ask: 'What are people discussing in the Networking Basics forum?' |
| get_forum_postsA | Answers 'what did the instructor answer in that thread?' 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. Input: discussion_id, the number shown as discussion_id in get_forum_discussions. Ask: 'What did the instructor answer in the Lab 3 thread?' |
| get_fileA | Answers 'what does this course file say?' Downloads one course file resource, such as a PDF, slide deck or handout, from its file_url. Supported types: plain text, HTML and PDF. 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. Input: file_url, the link from get_course_content. Ask: 'Read the Week 3 slides PDF.' |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 17 tools
Five tools answer overlapping 'what do I need to do' questions: get_missing_work, get_assignments, get_todo, get_upcoming_due_dates, get_overdue, and get_calendar all return items with due dates. The descriptions work hard to draw boundaries (get_todo is a cross-course digest, get_calendar accepts arbitrary ranges, get_overdue is backwards-looking), but an agent asking 'what's due?' still faces a real choice among several plausible tools. Distinct tools like get_file, get_forum_posts, and get_course_page are clearly separated.
Every tool follows a uniform get_<noun> snake_case pattern with no deviations, and related tools share noun stems (get_assignments/get_assignment_details, get_forum_discussions/get_forum_posts, get_course_content/get_course_page/get_course_grade_items). The convention is fully predictable.
17 tools is at the upper end of comfortable, but each maps to a distinct Moodle concept (courses, assignments, quizzes, grades, forums, announcements, content, files, calendar). A few could plausibly be folded together (get_upcoming_due_dates/get_overdue/get_missing_work), but nothing is redundant filler.
Read coverage is broad and coherent: courses, assignments, quizzes, grades, gradebook items, forum discussions and posts, announcements, course structure, page text, files, and calendar. The obvious gap is the absence of any write/action tool — no submit assignment, upload file, or post to a forum — which limits the server to read-only advising despite a student lifecycle that normally includes submitting work.