Moodle MCP for Students
A read-only Moodle assistant for students that lets AI apps query courses, deadlines, grades, course materials, files, and announcements.
List your current Moodle courses and their IDs.
Find upcoming due dates, overdue work, and missing/unsubmitted assignments.
Get a prioritized “what to do next” digest with overdue work, due soon items, no-due-date assignments, and recent announcement subjects.
View assignments with due dates and submission status: not submitted, draft, submitted, or graded.
Check overall course grades and detailed gradebook items with marks and percentages.
Browse course sections, activities, intro text, file names, and safe file links.
Read Page activities as plain text.
Download and extract text from course files: plain text, HTML, and PDFs; other types return a link and note.
Read recent announcements with course names, dates, and text.
Optionally filter many queries by course IDs, and configure todo/overdue time windows.
Never submit, edit, or delete anything; all tools are read-only.
Read-only integration with Moodle via the mobile web service, enabling AI apps to retrieve current courses, upcoming due dates, overdue items, assignments, grades, grade items, course content, and announcements.
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., "@Moodle MCP for StudentsWhat's due in the next two weeks, and is anything overdue?"
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.
Moodle MCP for students
Add the server to your AI app with npx. Put your school's Moodle address and your key in the line for your app below, then run it.
Ask your AI what's actually left to do in Moodle with the Moodle MCP server.
This is a free, open source Moodle MCP server. It lets Claude Desktop, Claude Code, Cursor, VS Code and other AI apps that run a local MCP server read your Moodle courses, due dates, grades and announcements. It is read only. It can never submit, edit or delete anything.
Works with Moodle sites that have the mobile web service turned on. Not affiliated with Moodle Pty Ltd.
Free forever. No sign up and no subscription. Your login details only ever go to your own school.
Install
Claude Code
Run this in a terminal:
claude mcp add moodle --env MOODLE_BASE_URL=https://moodle.yourschool.edu --env MOODLE_TOKEN=your-key -- npx -y moodle-student-mcpAdd --scope user if you want the server in every project.
Cursor
Run this in a terminal. Cursor keeps its servers in mcp.json, so this line writes the server into ~/.cursor/mcp.json and leaves the servers you already have alone. On Windows that file is %USERPROFILE%\.cursor\mcp.json.
node -e "const fs=require('fs'),os=require('os'),path=require('path'),file=path.join(os.homedir(),'.cursor','mcp.json');let config={};try{config=JSON.parse(fs.readFileSync(file,'utf8'))}catch(error){}config.mcpServers={...(config.mcpServers||{}),moodle:{type:'stdio',command:'npx',args:['-y','moodle-student-mcp'],env:{MOODLE_BASE_URL:'https://moodle.yourschool.edu',MOODLE_TOKEN:'your-key'}}};fs.mkdirSync(path.dirname(file),{recursive:true});fs.writeFileSync(file,JSON.stringify(config,null,2));"VS Code
Run this in a terminal:
code --add-mcp "{\"name\":\"moodle\",\"type\":\"stdio\",\"command\":\"npx\",\"args\":[\"-y\",\"moodle-student-mcp\"],\"env\":{\"MOODLE_BASE_URL\":\"https://moodle.yourschool.edu\",\"MOODLE_TOKEN\":\"your-key\"}}"The quotes inside the JSON are escaped, so the command runs the same way in a Mac or Linux terminal and in the Windows Command Prompt. In PowerShell on Windows, use this line instead:
code --add-mcp '{\"name\":\"moodle\",\"type\":\"stdio\",\"command\":\"npx\",\"args\":[\"-y\",\"moodle-student-mcp\"],\"env\":{\"MOODLE_BASE_URL\":\"https://moodle.yourschool.edu\",\"MOODLE_TOKEN\":\"your-key\"}}'This adds the server to your user profile, so it is there in every project.
Claude Desktop
Paste this into your MCP config (for Claude Desktop that's claude_desktop_config.json):
{
"mcpServers": {
"moodle": {
"command": "npx",
"args": ["-y", "moodle-student-mcp"],
"env": {
"MOODLE_BASE_URL": "https://moodle.yourschool.edu",
"MOODLE_TOKEN": "your-key"
}
}
}
}Restart the app if it was already running, then ask:
"What's due this week?"
"Is anything overdue?"
"What work am I still missing?"
"What's my grade in Networking?"
Related MCP server: Moodle Study MCP
Demo
Here is a whole exchange from start to finish. The lines under "The server answers" are the exact text the tools send back, copied from a run of this code against the test Moodle site that ships with the tests. The courses, dates and announcements are made up sample data, and the times are UTC. Copy the block into any chat app to see what an answer looks like before you install anything.
You: What should I do today?
Tool call: get_todo
{"name":"get_todo","arguments":{}}
The server answers:
Start here: Problem set 1 (Data Structures) was due Mon, Oct 19, 11:59 p.m. UTC, not submitted
Overdue:
- Problem set 1 (Data Structures) was due Mon, Oct 19, 11:59 p.m. UTC, not submitted
Due soon:
- Quiz 1 closes (Networking Basics) is due Fri, Oct 23, 11:59 p.m. UTC
- Lab 3: routing table (Networking Basics) is due Wed, Oct 28, 11:59 p.m. UTC, not submitted
- Lab 4: report draft (Networking Basics) is due Mon, Nov 2, 11:59 p.m. UTC, draft, not submitted
- Problem set 3 (Data Structures) is due Mon, Nov 2, 11:59 p.m. UTC
New announcements:
- Lab 3 is due Friday (Networking Basics, Wed, Oct 21, 9:15 a.m. UTC)
- Week 6 reading (Networking Basics, Tue, Oct 20, 2:05 p.m. UTC)
- Room change for Thursday (Data Structures, Mon, Oct 19, 4:40 p.m. UTC)
The app replies: Start with Problem set 1 in Data Structures, which was due Monday. Quiz 1 closes Friday, the Lab 3 routing table is due Wednesday, and the Lab 4 report draft and Problem set 3 are due Nov 2. The latest announcements mention the Lab 3 deadline, the Week 6 reading and a room change for Data Structures.
You: What's due this week?
Tool call: get_upcoming_due_dates
{"name":"get_upcoming_due_dates","arguments":{}}
The server answers:
- Quiz 1 closes (Networking Basics) due Fri, Oct 23, 11:59 p.m. UTC
- Lab 4 report (Networking Basics) due Wed, Oct 28, 11:59 p.m. UTC
- Problem set 3 (Data Structures) due Mon, Nov 2, 11:59 p.m. UTC
The app replies: Three things are due soon. Quiz 1 closes on Friday, the Lab 4 report is due on Wednesday, and Problem set 3 in Data Structures is due on Monday.
You: What's due in Networking Basics?
Tool call: get_my_courses
{"name":"get_my_courses","arguments":{}}
The server answers:
- Networking Basics [id 11]
- Data Structures [id 12]
Tool call: get_upcoming_due_dates
{"name":"get_upcoming_due_dates","arguments":{"course_ids":[11]}}
The server answers:
- Quiz 1 closes (Networking Basics) due Fri, Oct 23, 11:59 p.m. UTC
- Lab 4 report (Networking Basics) due Wed, Oct 28, 11:59 p.m. UTC
The app replies: Networking Basics has two things due soon: Quiz 1 closes on Friday and the Lab 4 report is due on Wednesday.
You: Is anything overdue?
Tool call: get_overdue
{"name":"get_overdue","arguments":{}}
The server answers:
- Problem set 1 (Data Structures) was due Mon, Oct 19, 11:59 p.m. UTC
The app replies: One thing is overdue: Problem set 1 in Data Structures, which was due on Monday, Oct 19.
You: Which assignments have I not submitted in Networking Basics?
Tool call: get_my_courses
{"name":"get_my_courses","arguments":{}}
The server answers:
- Networking Basics [id 11]
- Data Structures [id 12]
Tool call: get_assignments
{"name":"get_assignments","arguments":{"course_id":11}}
The server answers:
- Lab 1: LAN cabling due Fri, Oct 9, 11:59 p.m. UTC graded 8.00 / 10.00
- Lab 2: subnetting worksheet due Fri, Oct 16, 11:59 p.m. UTC submitted
- Lab 3: routing table due Wed, Oct 28, 11:59 p.m. UTC not submitted
- Lab 4: report draft due Mon, Nov 2, 11:59 p.m. UTC draft, not submitted
The app replies: Networking Basics is course 11. Lab 3 routing table has not been submitted, and Lab 4 report draft is still a draft, so it is saved but not handed in. Lab 2 was submitted and Lab 1 is graded 8.00 out of 10.
You: What work am I still missing?
Tool call: get_missing_work
{"name":"get_missing_work","arguments":{}}
The server answers:
- Problem set 1 (Data Structures) was due Mon, Oct 19, 11:59 p.m. UTC, not submitted
- Lab 3: routing table (Networking Basics) is due Wed, Oct 28, 11:59 p.m. UTC, not submitted
- Lab 4: report draft (Networking Basics) is due Mon, Nov 2, 11:59 p.m. UTC, draft, not submitted
- Problem set 2 (Data Structures) is due Fri, Nov 6, 11:59 p.m. UTC, not submitted
The app replies: Four assignments are still not handed in. Problem set 1 in Data Structures was due on Oct 19, Lab 3 routing table in Networking Basics is due on Oct 28, the Lab 4 report draft in Networking Basics is due on Nov 2 and is still only a draft, and Problem set 2 in Data Structures is due on Nov 6.
You: How am I doing in Networking Basics?
Tool call: get_my_courses
{"name":"get_my_courses","arguments":{}}
The server answers:
- Networking Basics [id 11]
- Data Structures [id 12]
Tool call: get_my_grades
{"name":"get_my_grades","arguments":{}}
The server answers:
- Networking Basics 88.50
- Data Structures no grade posted yet
Tool call: get_course_grade_items
{"name":"get_course_grade_items","arguments":{"course_id":11}}
The server answers:
- Lab 1: LAN cabling 8.00 (80.00 %)
- Lab 2: subnetting worksheet 9.00 (90.00 %)
- Course total 88.50 (88.50 %)
The app replies: Networking Basics has a course total of 88.50, which is 88.50 percent. Lab 1 is 8.00 (80.00 percent) and Lab 2 is 9.00 (90.00 percent). Data Structures has no grade posted yet.
You: Any new announcements?
Tool call: get_announcements
{"name":"get_announcements","arguments":{}}
The server answers:
- Lab 3 is due Friday (Networking Basics, Wed, Oct 21, 9:15 a.m. UTC)
Bring your laptop and the patched topology sheet.
- Week 6 reading (Networking Basics, Tue, Oct 20, 2:05 p.m. UTC)
Read chapters 4 and 5 before the quiz.
- Room change for Thursday (Data Structures, Mon, Oct 19, 4:40 p.m. UTC)
Data Structures meets in room B12 this week.
The app replies: Three announcements. Lab 3 is due Friday, so bring your laptop and the patched topology sheet. Week 6 reading says to read chapters 4 and 5 before the quiz. Data Structures has a room change for Thursday.Quick start
In Moodle, open your profile menu, go to Preferences > User account > Security keys. Copy the key for Moodle mobile web service. The guide to getting your Moodle mobile web service key has each step, plus what to do when the page or the key is missing.
Put your school's Moodle address and that key into the command or the config block above.
Restart your AI app and ask one of the questions above.
To check your setup first, run npx moodle-student-mcp doctor with the two environment variables set.
If you can't find a Security keys page, your school has turned off the mobile web service, or signs you in through single sign on without exposing keys. In that case this server can't connect to your account.
What you can ask
"What's due this week?"
"What's due in Networking Basics?"
"What's due in the next two weeks?"
"What should I do today?"
"Is anything overdue?"
"Anything overdue in Networking Basics?"
"What work am I still missing?"
"What's my grade in each course, and what's in the gradebook for Networking?"
"Any new announcements?"
"Which assignments have I not submitted yet?"
"What's in each week of Networking Basics?"
"Read me the Week 1 page in Networking Basics."
"Open the slides PDF from week 2 and summarize it."
Tools
All tools are read only.
Tool | What it does |
| Your current courses and their IDs |
| Items that still need action and are due in the next 60 days, soonest first. Plain course events such as 'Course starts' are left out. Takes an optional |
| Past due items that still need action. Takes an optional |
| One digest for what to do next: overdue work, work due soon, assignments with no due date and the latest announcement subjects, each with the course name and due date. Takes an optional |
| Assignments for a course with due dates and submission status. Takes a |
| Assignments you have not handed in yet, drafts included, with the course name and the due date. Takes an optional |
| Current grade for each course |
| Every graded item in a course with mark and percentage. Takes a |
| Sections and activities for a course, with the intro text of each activity, such as assignment instructions or label text, plus file names and links that leave your key out. Takes a |
| Read the Page activities of a course as plain text, up to 5 pages with up to 20000 characters each. Images and embedded media are not shown. Takes a |
| Download a course file from your school's Moodle site and return its text. Plain text, HTML and PDF files with readable text come back as text. 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 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. Takes a |
| Recent announcements with the course name and date on each one, and any course Moodle will not open left out. Takes an optional |
Privacy and security
Your key stays on your computer. It is only sent to your own school's Moodle address.
Nothing is sent to any other server by this project.
get_filedownloads files up to 25 MB. A bigger file, such as a lecture video, is not downloaded; you get its name and link to open it in Moodle instead.get_fileonly downloads a link that points at your school's Moodle address. A link that points somewhere else is refused, so a link in a course page or an announcement can never take your key.Every tool is marked read only. You can reset your key any time on the Security keys page.
Troubleshooting
Every tool returns these messages when the setup is off. Each one comes with the fix.
Message | Fix |
Not signed in | Your key expired or was reset. Copy the new one from Preferences > User account > Security keys and update |
Access denied | Your school turned that feature off for students. If you copied the key yourself, make sure it is the Moodle mobile web service one on Preferences > User account > Security keys. |
Web services not enabled | Your school hasn't turned on the mobile web service, so there is no Moodle mobile web service key on Preferences > User account > Security keys. Ask your school to turn it on. |
Not found | Check the course ID with |
The school's server sent a reply this server can't read | Check that |
Development
npm install
npm run build
npm testDevelopment needs Node 22.12 or newer, because the test runner needs it. The server itself runs on Node 20 or newer.
Tests run against a fake Moodle server, so they need no account or network.
The demo transcript above comes from the same code. Run npm run demo to print it again after you change a tool, and npm test checks that the README still matches what the tools answer.
If this saved you time digging through Moodle, please give the repo a star. It sits at 0 stars, and one star helps the next student find it.
Moodle vs Brightspace
Both are free, open source, read only MCP servers for students. Use the one that matches your school's learning platform. If your school uses both, or you move between schools, you can run both side by side under different server names in your MCP config.
Moodle MCP | ||
Learning platform | Moodle | D2L Brightspace |
Sign in | Moodle mobile web service key from your Security keys page | Browser sign in, works with Microsoft, Duo, Okta and Shibboleth |
School setup needed | Mobile web service must be turned on | None |
Courses, due dates, grades | Yes | Yes |
Submission status per assignment | Yes | Yes |
Course files | Yes | Yes |
Announcements | Yes | Yes |
Discussions, roster, calendar, grade outlook | No | Yes |
Target grade calculator | No | Yes |
Cost | Free | Free |
More free student MCP servers
All free, open source and read only where they touch your accounts. Browse the full list at brightspacemcp.com/more-mcps.
Server | What it does |
D2L Brightspace for AI. Due dates with real submission status, grades, a target grade calculator and course files. | |
Canvas LMS for AI, read only. Due dates, missing work, grades and announcements. | |
Google Classroom for AI, read only. Todos, due dates, missing work and grades. | |
GPA, grade conversion and the grade you need on the final, for AI. Works offline, no account. | |
APA, MLA and Chicago citations from a DOI, an ISBN or typed details. No account. | |
Exam study schedules, spaced repetition dates, pomodoro plans and assignment milestones. Works offline. | |
Search scholarly papers, find open access copies and related work through OpenAlex. No key needed. | |
Clean, convert, dedupe and lint BibTeX, RIS and CSL JSON reference lists, and make cite keys. Works offline. | |
Find free legal copies of textbooks on OpenStax, DOAB and Open Library, look up editions by ISBN and suggest cheaper older ones. | |
Chemistry and physics homework math: molar mass, balancing equations, grams to moles, unit conversion and significant figures. Works offline. | |
Offline writing metrics for essays. Word and page counts, readability scores, passive voice, repeated openers, filler words, long sentences and word limit checks, so students can check their work against assignment requirements. No account, no network. | |
Syllabus to calendar MCP server. Extract dates from syllabus text, build an ics calendar, expand recurring classes and merge calendars. Works offline, no account. | |
Job application tracker MCP server. Track internships, jobs, interviews and deadlines offline, see what is coming up, and export your list as CSV or Markdown. No account and no API keys. |
License
MIT
Available Tools
12 toolsget_announcementsAnnouncementsARead-only
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?'
| Name | Required | Description | Default |
|---|---|---|---|
| course_ids | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds concrete behavioral detail beyond the annotations: caps of 5 posts per forum and 10 forums, plus fault tolerance ('a course or forum the school server will not open is left out and the rest still shows'). This resilience disclosure is genuinely useful and not derivable from readOnlyHint/openWorldHint.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the intent question and scoped limits before parameter guidance. The closing 'Ask: ...' sentence partly repeats the opening question, a small redundancy, but the rest earns its space.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-optional-parameter read tool with annotations and no output schema, the description covers purpose, default scope, and partial-failure behavior adequately. Only minor gaps remain, such as ordering of results.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is low, but the description compensates by explaining course_ids is optional and that omitting it covers all current courses, and the schema itself notes using get_my_courses to find IDs. It doesn't clarify accepted string-vs-number ID forms, a minor gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Lists the latest news forum posts') with the exact fields returned (subject, course name, text), clearly distinct from all siblings like get_my_courses and get_assignments.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explains the triggering intent ('any new announcements?') and clarifies course_ids is optional, defaulting to all current courses when omitted. It does not name any alternative or exclusion criteria, but no sibling tool overlaps with this purpose.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_assignmentsCourse assignmentsARead-only
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?'
| Name | Required | Description | Default |
|---|---|---|---|
| course_id | Yes | Moodle course ID. Use get_my_courses to find it. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint, so the safety profile is covered. The description adds real value beyond that: a 25-item result cap and the exact set of possible submission statuses, neither of which appears in the schema. It doesn't explain what happens when the cap is hit or whether results are ordered by due date.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose statement is front-loaded and the limit/status detail follows efficiently. The trailing example question is somewhat redundant with the opening question framing, which is the only wasted space.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only, single-parameter list tool with annotations covering safety and no output schema, the description supplies enough: scope, cap, and status vocabulary. The only meaningful omission is whether a course with more than 25 assignments is truncated silently.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single course_id parameter is fully documented in the schema, including the pointer to get_my_courses. The description restates that pointer but adds no format or edge-case detail, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a concrete verb and resource — 'Lists up to 25 assignments for one course with due dates and submission status' — and enumerates the status values. It implies the course-scoped niche versus sibling tools like get_missing_work or get_upcoming_due_dates but never names them explicitly, so differentiation is left to inference.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It frames the usage as a concrete question ('what do I still need to submit in this course?') and gives an example invocation, plus tells the caller to source course_id from get_my_courses. It stops short of stating when to prefer a sibling such as get_missing_work or get_todo, which would have earned the top score.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_course_contentCourse contentARead-only
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?'
| Name | Required | Description | Default |
|---|---|---|---|
| course_id | Yes | Moodle course ID. Use get_my_courses to find it. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/openWorld annotations, the description discloses meaningful behavior: sections contain up to 40 activities, activity intro text is included when present, and file links have your key removed so they are safe to show in chat. That is exactly the kind of output and safety context annotations do not provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The answer is front-loaded with the core question it addresses, then moves through sections, activities, files, input, and an example ask. Every sentence contributes useful selection or expectation-setting information, and the example is brief enough to justify its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description carries the return-shape burden and does so well: sections, activities, intro text, files, and safe links are all explained. Annotations cover safety and openness, and the single required parameter is fully documented. Nothing an agent needs to call this correctly appears to be missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The only parameter is fully documented in the schema, including that it is the Moodle course ID found via get_my_courses. The description repeats the same source guidance but adds no syntax, format, or constraint details beyond the schema. With 100% schema coverage, this meets the baseline rather than exceeding it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb-and-resource purpose: listing sections and activities within one course, including files, with an explicit framing question. It distinguishes itself from file-opening tools by explaining that links are safe for chat and can still be opened with get_file. An agent can tell what this tool returns without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It clearly establishes the use case: answering what materials are in a course, with course_id sourced from get_my_courses. It also names get_file as the follow-up tool for opening file links. It does not explicitly exclude sibling tools such as get_course_page or get_assignments, but the context is clear enough for selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_course_grade_itemsGrade breakdownARead-only
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.'
| Name | Required | Description | Default |
|---|---|---|---|
| course_id | Yes | Moodle course ID. Use get_my_courses to find it. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnly and openWorld, so the description's job is to say what comes back. It does: per-item marks and percentages plus the course total when one exists, and the 'when there is one' hedge correctly signals that the total is conditional.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The question framing front-loads the purpose, then input, then an example: three compact sentences with no filler. The quoted 'Ask:' example is slightly redundant with the opening question but still earns its place as a trigger.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a single-parameter read tool with no output schema, so the description must carry the return shape, and it does by naming marks, percentages and the conditional course total. It lacks detail on ordering, empty-gradebook behavior or whether ungraded items appear.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the schema already says the course_id is a Moodle course ID found via get_my_courses. The description repeats that same guidance without adding format or type details, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: list every graded item for one course with mark and percentage. It implies a course-scoped scope that separates it from a global grades tool, but it never names get_my_grades or another sibling, so differentiation is inferential.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a concrete trigger question and an example prompt, plus explicitly routes the ID lookup to get_my_courses. It omits when-not-to-use guidance, e.g. how it differs from get_my_grades or get_assignments.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_course_pageCourse pageARead-only
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.'
| Name | Required | Description | Default |
|---|---|---|---|
| course_id | Yes | Moodle course ID. Use get_my_courses to find it. | |
| page_name | No | Part of the page title, as shown in get_course_content. Leave out to read the first pages. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint and openWorldHint; the description adds substantial behavior beyond them: a 5-page cap, 20000-character per-page limit, the '[truncated]' marker, and the exclusion of images/embedded media. These are exactly the operational traits an agent needs to interpret output correctly.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
An effective lead sentence answers the core question, followed by scope, limits, inputs, and an example in a tight sequence. Every sentence carries distinct information (limits, exclusions, parameter sourcing) with no repetition of the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description still explains the return form (plain text, HTML stripped, truncation marker, no media) and the pagination-like cap, so the agent knows what it will get. Nothing needed for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, and the description adds a little genuine meaning: page_name is a 'word or phrase from the page title' used to pick one page, and omitting it reads the first pages. It doesn't add format/syntax detail beyond the schema, so it stays just above baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource ('Reads the Page activities of one course... returns their text') and scopes it to pages listed as 'page' in get_course_content, distinguishing it from get_file and get_course_content. An agent can tell immediately what this returns without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states how to source course_id ('the ID from get_my_courses'), how page_name selects one page versus reading the first pages when omitted, and pairs it with a concrete invocation example ('Read the Week 2 reading page in Networking Basics'). Alternative behavior (omitting page_name) is spelled out rather than left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_fileCourse fileARead-only
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.'
| Name | Required | Description | Default |
|---|---|---|---|
| file_url | Yes | URL of the course file to download. Use the link from get_course_content. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses the full outcome matrix — text/HTML returned as readable text, PDF with text extracted, PDF without text or unsupported types falling back to file name plus a redacted link and a Moodle note — which annotations (readOnlyHint, openWorldHint) do not cover. The security note that only links on the school's Moodle site are downloaded, so the key is never sent elsewhere, is valuable context beyond structured fields. No contradiction with the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core question and action, which is good, but repeats the same fallback clause ('file name, a link with your key removed and a note to open it in Moodle') three times and states supported types twice. The redundant sentences dilute an otherwise well-organized description.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter read tool with no output schema, the description covers the input's provenance, all supported and unsupported outcomes, the security boundary, and a usage example. An agent has everything needed to call it and anticipate what comes back.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with a single required parameter, so the baseline is 3; the description adds real value by specifying the parameter's origin ('the link from get_course_content') rather than any arbitrary URL. It does not add constraints such as whether the URL must be absolute or a Moodle-relative path, keeping it below a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Downloads one course file resource, such as a PDF, slide deck or handout') and anchors it to a concrete user question. It implicitly distinguishes itself from get_course_content, which supplies the link rather than the content, so an agent can route between them without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context ('Answers what does this course file say?'), names the upstream source ('the link from get_course_content') and provides a worked example ask. It stops short of an explicit when-not-to-use statement, e.g. 'use get_course_content to list files and this to read one,' but the sourcing instruction makes the split inferable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_missing_workMissing workARead-only
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?'
| Name | Required | Description | Default |
|---|---|---|---|
| course_ids | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint annotation it discloses real operational traits: drafts that were never handed in are included, handed-in/graded work is excluded, up to 25 assignments per course are checked, and results are capped at 50 items. Those inclusion/exclusion rules and truncation caps are exactly the kind of behavior an agent cannot get from annotations or schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the intent question, then scope, exclusions, and limits in a logical order; every sentence carries information. The closing 'Ask: ...' line partially restates the opening question, a small redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only filter tool with no output schema, it covers inclusion rules, exclusions, per-course scan depth, result cap, and the fields returned (course name, due date). What is missing is what happens when the 50-item cap truncates — ordering or a truncation indicator — which matters for an agent summarizing results.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema's course_ids property lacks a top-level description (0% coverage), and the description compensates by explaining that the array limits the list and that omitting it covers all current courses. It does not repeat the schema's note that IDs come from get_my_courses, but the key default semantics are supplied.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Lists the assignments in your courses that you have not handed in yet') and adds an intent framing ('what do I still owe?') an agent can match a user request against. The scope definition (not-submitted, includes drafts) implicitly separates it from get_overdue and get_upcoming_due_dates, but no sibling is named explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear trigger ('Ask: "What work am I still missing?"') plus the default behavior of omitting course_ids to cover all current courses, which is actionable selection context. It does not state when to prefer get_overdue, get_todo, or get_assignments instead, so the agent must infer the boundary.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_my_coursesMy coursesARead-only
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?'
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnlyHint and openWorldHint, so the description only needs to add context. It usefully adds that the call takes no input and returns current courses plus reusable course IDs, though it does not discuss ordering, hidden courses, or pagination.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the core question and followed by the return behavior and usage hint. There is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter read tool with no output schema, the description is complete enough: it states what is returned, that no input is required, and why the returned ID matters for other tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the baseline is 4. The description reinforces this with 'No input,' which is consistent with the empty schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: it lists the current Moodle courses the user is enrolled in. It also distinguishes itself from siblings by explaining that the returned ID is the course_id other tools consume.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives a clear triggering question and notes there is no input, and it explains the downstream use of the returned course ID. It does not explicitly compare against alternatives, but the usage context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_my_gradesMy gradesARead-only
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?'
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds useful behavioral detail that missing grades yield 'no grade posted yet', which prevents an agent from misreading empty results. It does not describe return shape or ordering, but with annotations present the bar is lower.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose and scope are front-loaded in the first two sentences. The trailing sample question largely restates the opening line, which is mild redundancy rather than harmful, so the description stays short and readable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, read-only lookup with no output schema and no nested objects, the description covers purpose, scope, and the empty-result behavior. Nothing an agent needs to call it correctly appears to be missing, though naming the item-level alternative would close the last gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline is 4. The description correctly states 'No input', consistent with the empty schema, and adds no misleading parameter guidance.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb/resource combination ('Shows the posted overall grade for every current course') and scopes it to overall per-course grades, which implicitly distinguishes it from the item-level sibling get_course_grade_items. It stops short of naming that sibling explicitly, so differentiation is left partly to inference.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied through the repeated sample question ('What's my grade in each course?'), which tells the agent the triggering scenario. However, there is no explicit statement about when to prefer this over get_course_grade_items or get_assignments, and no exclusions are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_overdueOverdue workARead-only
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?'
| Name | Required | Description | Default |
|---|---|---|---|
| course_ids | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the readOnly/openWorld profile, and the description adds substantive behavior beyond them: the 45-day lookback window, the 'still need action' filter, and the shape of what comes back (course name plus due date). It stops short of saying how results are ordered or what an empty answer looks like, but the added context is real.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the question it answers, then the return shape, then the parameter — a logical order with little waste. The only flaw is redundancy: 'is anything overdue?' appears at the start and again as a closing 'Ask:' line, which earns nothing the first sentence didn't.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-required-param read tool with no output schema, the definition supplies purpose, default scope, time window, and returned fields — enough to call it correctly and interpret results. Ranking/pagination behavior is unstated but unlikely to matter for this query shape.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% reported schema description coverage on the parameter itself, the description carries the burden and does so: course_ids is identified as an optional array that limits the list, and the default (omit it → all current courses) is spelled out. The schema's item description adds the get_my_courses pointer, which the prose doesn't repeat — minor, but the essential semantics are covered.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific question it answers ("is anything overdue?") and the resource it returns: past due items from the last 45 days that still need action, with course name and due date. That is concrete enough to separate it from get_upcoming_due_dates, but it never names or contrasts with the neighboring overdue/missing/todo tools, so sibling differentiation relies on inference.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It does give a usable when-to-use cue ("Ask: 'Is anything overdue?'") and a scoping rule (omit course_ids to cover all current courses). However, it gives no exclusions or alternatives — nothing tells the agent why to pick this over get_missing_work or get_todo, which likely overlap.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_todoWhat to do nextARead-only
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?'
| Name | Required | Description | Default |
|---|---|---|---|
| course_ids | No | ||
| days_ahead | No | How many days ahead to look. Default 14. | |
| overdue_days | No | How many days back to include overdue work. Default 14. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint and openWorldHint, so the description usefully carries the behavioral load: it describes the output structure (Start here line, then ordered sections), the data sources (assignment list for submission status, calendar for quizzes), and the selection rule for the most urgent item. It stops short of noting failure modes, result limits, or auth requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core purpose is front-loaded in the first clause, and the section-ordering detail is useful. The long run-on sentence and the closing 'Ask: What should I do today?' echo the opening, a minor redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description fully compensates by explaining the return shape, section order, and how the 'Start here' item is chosen. Combined with documented parameters, an agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 67% and every parameter already has a schema description, so the description's per-parameter prose largely restates defaults (14/14). It does add mild value by clarifying that course_ids limits the digest scope and how the day windows are applied, but this is mostly redundant with the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific purpose — a single cross-course digest answering 'what should I do today?' — and spells out its four sections (overdue, due soon, no due date, announcements). It implicitly distinguishes itself from siblings like get_overdue or get_upcoming_due_dates by being the aggregate, but never names those siblings explicitly, so it falls short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage context is clear via the framing question ('Ask: What should I do today?') and the described scope of the digest. However, there are no explicit exclusions or named alternatives telling an agent when to prefer get_overdue or get_announcements over this aggregate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_upcoming_due_datesUpcoming due datesARead-only
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?'
| Name | Required | Description | Default |
|---|---|---|---|
| course_ids | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond readOnlyHint/openWorldHint, the description discloses the 50-item cap, 60-day window, soonest-first ordering, included fields (course name, due date), and the exclusion of course events. That is rich behavior context the annotations do not carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The answer is front-loaded, with the purpose, scope, return shape, parameter behavior, and intent-routing example all in a compact sequence. Each sentence adds something an agent needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given one optional parameter, no output schema, and read-only/open-world annotations, the description covers everything needed: result limits, time window, ordering, fields, exclusions, and default parameter behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is low, but the description compensates fully: course_ids is an optional array that limits the list, and omitting it covers all current courses. That adds meaning beyond the JSON schema, which only defines the array type.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Lists up to 50 items due in the next 60 days') with scope, ordering, and exclusions, so an agent can distinguish it from siblings like get_overdue or get_assignments.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear context via the 'what is due soon?' framing and the 'still need action' filter, and explicitly excludes course events. It does not, however, name alternative tools such as get_overdue or state when not to use this one.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
1 tool update
v0.1.9- Added
get_course_page
11 tool updates
v0.1.5- First observed
get_announcements - First observed
get_assignments - First observed
get_course_content - First observed
get_course_grade_items - First observed
get_file - First observed
get_missing_work - First observed
get_my_courses - First observed
get_my_grades - First observed
get_overdue - First observed
get_todo - First observed
get_upcoming_due_dates
TDQS
Scored across 12 tools
Several tools overlap around deadlines and missing work: get_overdue, get_upcoming_due_dates, get_todo, get_missing_work, and get_assignments can all surface similar assignment information. Descriptions clarify the intended differences (digest vs. past due vs. upcoming vs. unsubmitted), but an agent could still hesitate between them. Grade tools (get_my_grades vs. get_course_grade_items) are distinguishable by scope.
All 12 tools use a consistent get_ prefix with snake_case names, making the set highly predictable. Minor semantic variation exists (get_overdue, get_todo), but the overall verb_noun convention is stable throughout.
Twelve tools is well-scoped for a student-facing Moodle assistant, covering courses, grades, deadlines, content, files, announcements, and assignments. No tool feels extraneous for the stated purpose.
The surface covers the main read-only student workflows: courses, grades, deadlines, course materials, announcements, and assignment status. Minor gaps include no assignment-submission action, no search, and limited interaction with forums or messages, but these are reasonable for a read-only student assistant.
Maintenance
Related MCP Connectors
Read-only access to Epivo's live course catalogue for AI agents.
Search university course materials, your flashcards, quizzes, streak and quota. All tools read-only.
Read-only access to your CodeMouse accounts, repositories, and AI pull-request reviews.
Read your events, sales, orders and attendees from your AI assistant. OAuth sign-in, read only.
Related MCP Servers
- AlicenseAqualityBmaintenanceEnables read-only querying of Moodle as a student, including courses, assignments, grades, forums, and files, using a personal web services token.110MIT
- FlicenseNot gradedqualityDmaintenanceEnables AI assistants to read your Moodle courses, list materials, quizzes, and search content to plan exam preparation through natural language.1-
- AlicenseAqualityAmaintenanceEnables AI apps to read a student's courses, due dates, grades, missing work, announcements, modules, discussions, syllabus, and calendar events in a read-only way. It cannot submit, edit, or delete anything, and credentials go only to the user's own school.16917 npmMIT
- AlicenseAqualityAmaintenanceLets AI apps read a student's Google Classroom data, including active classes, to-do and missing assignments, upcoming due dates, grades on returned work, and announcements. It is read-only, so it can never turn in, edit, or delete anything.121,002 npmMIT