Skip to main content
Glama

Moodle MCP for students

npm downloads license MCP Registry

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

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

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

  2. Put your school's Moodle address and that key into the command or the config block above.

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

Supported Moodle versions and web service functions

This server talks to the standard Moodle web service API with your Moodle mobile web service key. It does not need a plugin or a custom service. I have not tested a list of Moodle versions, so there is no version table here. Tests run against a fake Moodle server. As a rule, a site where the official Moodle mobile app works for students should work here too, and npx moodle-student-mcp doctor tells you if your site answers.

If a tool says Access denied, your school's admin may have left a function out of the mobile web service. These are the functions the server calls, and the tools that use them:

Web service function

Used by

core_webservice_get_site_info

Sign in check and doctor

core_enrol_get_users_courses

get_my_courses and every tool that lists courses

core_calendar_get_action_events_by_timeframe

get_upcoming_due_dates, get_overdue, get_calendar, get_todo

mod_assign_get_assignments

get_assignments, get_assignment_details, get_missing_work, get_todo

mod_assign_get_submission_status

get_assignments, get_missing_work, get_todo

mod_quiz_get_quizzes_by_courses

get_quizzes

mod_quiz_get_user_attempts

get_quizzes

mod_quiz_get_user_best_grade

get_quizzes

gradereport_overview_get_course_grades

get_my_grades

gradereport_user_get_grade_items

get_course_grade_items

core_course_get_contents

get_course_content

mod_page_get_pages_by_courses

get_course_page

mod_forum_get_forums_by_courses

get_announcements, get_forum_discussions, get_todo

mod_forum_get_forum_discussions

get_announcements, get_forum_discussions, get_todo

mod_forum_get_discussion_posts

get_forum_posts

get_file does not use a web service function. It downloads a file link from your school's Moodle site with your key.

If only some functions are off, the other tools keep working.

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?"

  • "What are people discussing in the Networking Basics forum?"

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

Why Moodle MCP

Moodle MCP is a Moodle AI assistant for students. Your AI app asks your school's Moodle for your courses, due dates, grades, quizzes, forums and files, then answers in plain language. It only reads. It cannot submit, edit or delete anything, and your key goes only to your own school.

Here is how it compares with the other ways to get Moodle into a chat:

Moodle MCP

Copy and paste from Moodle

Other Moodle MCP servers

Moodle site or mobile app

Your AI can ask Moodle itself

Yes

No, you paste it

Yes

No

Made for students

Yes

Not applicable

Check each one

Yes

Safe to hand to an AI

Read only, no write calls

You choose what to paste

Check what each one can change

Not applicable

Needs a plugin on the school site

No

No

Check each one

No

Needs the mobile web service turned on

Yes

No

Check each one

Yes

Free

Yes

Yes

Check each one

Yes

For Brightspace, see the table in Moodle vs Brightspace.

Works with

App

How to add it

Claude Desktop

Paste the config block under Claude Desktop

Claude Code

Run the claude mcp add line under Claude Code

Cursor

Run the line under Cursor

VS Code

Run the code --add-mcp line under VS Code

Windsurf

Add the same npx -y moodle-student-mcp command and the two environment variables to its MCP config

Any other app that runs a local MCP server over stdio can use the same command.

Tools

All tools are read only.

Tool

What it does

get_my_courses

Your current courses and their IDs

get_upcoming_due_dates

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 course_ids list of course IDs

get_overdue

Past due items that still need action. Takes an optional course_ids list of course IDs

get_calendar

Calendar events between a start_date and an end_date (YYYY-MM-DD), oldest first, including events that need no action. Works for any dates, up to 366 days. Takes an optional course_ids list of course IDs

get_todo

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 course_ids list, plus days_ahead and overdue_days to set the window

get_assignments

Assignments for a course with due dates and submission status. Takes a course_id from get_my_courses

get_assignment_details

The due date, instructions and attached files of the assignments in a course, up to 5 at a time. Attached files come with a link ready for get_file. Takes a course_id from get_my_courses and an optional assignment_name, part of an assignment name, to pick one

get_quizzes

Quizzes for a course with open and close dates, time limit, attempts used and allowed, and your best grade. Takes a course_id from get_my_courses

get_missing_work

Assignments you have not handed in yet, drafts included, with the course name and the due date. Takes an optional course_ids list of course IDs

get_my_grades

Current grade for each course

get_course_grade_items

Every graded item in a course with mark and percentage. Takes a course_id from get_my_courses

get_course_content

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 course_id from get_my_courses

get_course_page

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 course_id from get_my_courses and an optional page_name, part of a page title from get_course_content, to pick one page

get_file

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 file_url from get_course_content

get_announcements

Recent announcements with the course name and date on each one, and any course Moodle will not open left out. Takes an optional course_ids list of course IDs

get_forum_discussions

Latest discussions in the forums of a course, with author, date, reply count and the start of the text. Announcement forums are left out. Takes a course_id from get_my_courses and an optional forum_name, part of a forum name, to pick one forum. Each discussion shows a discussion_id

get_forum_posts

Read one forum discussion with the first post and every reply, with author, date and text. Takes a discussion_id from get_forum_discussions

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_file downloads 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_file only 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 MOODLE_TOKEN.

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

The school's server sent a reply this server can't read

Check that MOODLE_BASE_URL points at your Moodle site's address.

Development

npm install
npm run build
npm test

Development 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

Brightspace 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

Brightspace MCP

D2L Brightspace for AI. Due dates with real submission status, grades, a target grade calculator and course files.

Canvas MCP

Canvas LMS for AI, read only. Due dates, missing work, grades and announcements.

Google Classroom MCP

Google Classroom for AI, read only. Todos, due dates, missing work and grades.

GPA Calculator MCP

GPA, grade conversion and the grade you need on the final, for AI. Works offline, no account.

Citations MCP

APA, MLA and Chicago citations from a DOI, an ISBN or typed details. No account.

Study Planner MCP

Exam study schedules, spaced repetition dates, pomodoro plans and assignment milestones. Works offline.

Paper Finder MCP

Search scholarly papers, find open access copies and related work through OpenAlex. No key needed.

BibTeX Reference Manager MCP

Clean, convert, dedupe and lint BibTeX, RIS and CSL JSON reference lists, and make cite keys. Works offline.

Open Textbook Finder MCP

Find free legal copies of textbooks on OpenStax, DOAB and Open Library, look up editions by ISBN and suggest cheaper older ones.

STEM Calculator MCP

Chemistry and physics homework math: molar mass, balancing equations, grams to moles, unit conversion and significant figures. Works offline.

Essay Stats MCP

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

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

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

17 tools
get_announcementsAnnouncementsA
Read-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?'

NameRequiredDescriptionDefault
course_idsNo

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_assignment_detailsAssignment detailsA
Read-only

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?'

NameRequiredDescriptionDefault
course_idYesMoodle course ID. Use get_my_courses to find it.
assignment_nameNoPart of the assignment name. Leave out to read the first assignments by due date.

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover the read-only/open-world profile, but the description adds genuinely useful behavior: results are capped at 5 at a time, and attached files come back with the key stripped from the link so they are ready for get_file. It does not say how to retrieve the remaining assignments beyond the 5-item cap or what happens when the name filter matches nothing.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the user question it answers, then the return contents, then the inputs. Mostly economical, though the closing example question partly duplicates the opening framing and the assignment_name wording repeats the schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description carries the return-value burden and does so: due date, instructions, file names and keyless links, plus the 5-item cap. Gaps remain around ordering of results when no name is given and empty-match behavior, but the essentials for a correct call are present.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so both parameters are already documented. The description restates the same facts (course_id from get_my_courses, assignment_name as a name fragment) without adding new syntax, matching rules, or behavior for ambiguous matches. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource with scope: it returns due date, instructions and attached files for assignments in one course, up to 5 at a time. The framing question 'what does assignment X require?' plus the explicit return fields make it clearly distinct from list-style siblings like get_assignments, and it names get_file and get_my_courses as related tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives concrete entry conditions: course_id must come from get_my_courses, and assignment_name (a name fragment) narrows to one assignment. It also shows a worked example query. It stops short of saying when NOT to use it, e.g. 'use get_assignments instead if you only need the list of assignments'.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_assignmentsCourse assignmentsA
Read-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?'

NameRequiredDescriptionDefault
course_idYesMoodle course ID. Use get_my_courses to find it.

TDQS

A3.9/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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_calendarCalendar for a date rangeA
Read-only

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?'

NameRequiredDescriptionDefault
end_dateYesLast day to show, as YYYY-MM-DD. Events on this day are included.
course_idsNo
start_dateYesFirst day to show, as YYYY-MM-DD.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly and openWorld, but the description adds real operational detail beyond them: a 50-event cap, a 366-day maximum window, oldest-first ordering, inclusive endpoints, and the fact that non-actionable events are included. These are exactly the limits an agent needs to avoid misreporting results.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Dense but well front-loaded: purpose, scope, sibling contrast, then parameters. Minor waste in restating inclusive date bounds already covered by the schema, and the example question about 'what is due' slightly blurs the distinction between calendar events and due dates.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description carries the burden of describing results and does so: course name and date, oldest first, capped at 50. Combined with the date-window limit and timezone note, an agent has everything needed to call it and interpret the response.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 67%, and the description fills the main gap by specifying the server's local time zone for the date strings and reiterating inclusive boundaries and the optional course_ids filter. It adds meaning beyond the schema but does not explain how course_ids behaves with multiple values or how to page past the 50-event cap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a concrete user question and states a specific verb and resource: lists up to 50 calendar events between start_date and end_date, oldest first, with course name and date. It explicitly differentiates itself from get_upcoming_due_dates and get_overdue, so an agent can route correctly 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.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Names the two alternative tools and the condition that selects this one: any dates, past or future, and events that need no action. The closing example ('What is due the week of Dec 1?') reinforces the trigger condition, leaving little to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_course_contentCourse contentA
Read-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?'

NameRequiredDescriptionDefault
course_idYesMoodle course ID. Use get_my_courses to find it.

TDQS

A4.5/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 breakdownA
Read-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.'

NameRequiredDescriptionDefault
course_idYesMoodle course ID. Use get_my_courses to find it.

TDQS

A3.9/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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 pageA
Read-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.'

NameRequiredDescriptionDefault
course_idYesMoodle course ID. Use get_my_courses to find it.
page_nameNoPart of the page title, as shown in get_course_content. Leave out to read the first pages.

TDQS

A4.9/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 fileA
Read-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.'

NameRequiredDescriptionDefault
file_urlYesURL of the course file to download. Use the link from get_course_content.

TDQS

A4.5/5.0
Behavior5/5

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.

Conciseness3/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_forum_discussionsForum discussionsA
Read-only

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?'

NameRequiredDescriptionDefault
course_idYesMoodle course ID. Use get_my_courses to find it.
forum_nameNoPart of the forum name. Leave out to read the first forums of the course.

TDQS

A4.3/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnly/openWorld annotations, it discloses result caps (5 discussions per forum, up to 5 forums), announcement-forum filtering, and partial-failure behavior ('a forum the school server will not open is named at the end and the rest still shows'). It also lists the fields returned, so the agent knows what evidence it will get before calling.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The body is front-loaded and dense with useful facts, but the example question 'What are people discussing in the Networking Basics forum?' is stated twice, once at the opening and again at the end, which is pure redundancy. The chatty question framing also delays the actual verb-and-resource statement.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only listing tool with no output schema, the description covers inputs, selection rules, truncation limits, exclusions, returned fields, and degraded-response behavior. An agent has everything needed to call it correctly and to interpret a partial result.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description adds only marginal meaning: it clarifies that forum_name selects a single forum via a partial-name match, but course_id provenance is already stated in the schema and no match semantics (case, ambiguity, multiple matches) are explained.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Names a specific verb and resource ('Lists the latest discussions in the forums of one course') and enumerates the returned fields. It also distinguishes itself from get_announcements explicitly, so an agent can separate it from the closest sibling 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.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear context for use and one explicit exclusion ('Announcement forums are left out, use get_announcements for those'). It does not address the other obvious alternative, get_forum_posts, so the agent has no stated rule for choosing between reading a forum's discussion list and reading a discussion's posts.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_forum_postsForum threadA
Read-only

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?'

NameRequiredDescriptionDefault
discussion_idYesDiscussion ID shown in get_forum_discussions.

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the read-only and open-world annotations, it discloses the single-discussion scope, returned fields, and limits of 50 posts and 2000 characters per post. It does not explain ordering, which posts are selected when a thread exceeds 50 posts, or whether additional pages can be retrieved.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loads the intended task, followed by behavior, input provenance, and an example. The opening quoted question and final example are somewhat redundant, but neither is excessively verbose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple one-parameter read tool without an output schema, the description supplies enough information to select it, obtain the required ID, invoke it, and anticipate the returned content and size limits. The remaining uncertainty about threads over 50 posts does not prevent correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and the description largely repeats that discussion_id comes from get_forum_discussions. Calling it 'the number' adds little and is slightly narrower than the schema's string-or-number type, though the schema makes the accepted input clear.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states that the tool reads one forum discussion, including the first post and replies, and identifies the returned author, date, and text fields. This distinguishes it from get_forum_discussions, which supplies the discussion ID rather than reading the thread.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The opening instructor-answer question and closing Lab 3 example provide a concrete use case, while the input sentence points agents to get_forum_discussions as the ID source. It does not explicitly say to discover the discussion first when the ID is unknown or clarify that this tool is not for listing or searching discussions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_missing_workMissing workA
Read-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?'

NameRequiredDescriptionDefault
course_idsNo

TDQS

A4.2/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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 coursesA
Read-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?'

NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 gradesA
Read-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?'

NameRequiredDescriptionDefault

No parameters

TDQS

A3.6/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 workA
Read-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?'

NameRequiredDescriptionDefault
course_idsNo

TDQS

A3.8/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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_quizzesCourse quizzesA
Read-only

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?'

NameRequiredDescriptionDefault
course_idYesMoodle course ID. Use get_my_courses to find it.

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true, so safety is covered. The description goes further by disclosing the 25-item cap and enumerating exactly which fields come back (open/close dates, time limit, attempts used vs allowed, best grade). It does not say what happens with zero quizzes or whether the 25 cap can be exceeded, but the added behavioral context is substantial.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the user-facing questions, then the payload, then the input requirement — a sensible order with no filler. The second quoted example question largely duplicates the first sentence's prompts, so there is minor redundancy, but nothing bloated.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter read tool with no output schema, the description compensates by naming the returned fields and the 25-quiz ceiling, which is what an agent needs to decide whether the result is complete. Remaining gaps — empty-result behavior and pagination/truncation handling beyond the cap — are minor.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and there is only one parameter, already documented as 'Moodle course ID. Use get_my_courses to find it.' The description restates the same guidance ('course_id, the ID from get_my_courses') without adding format or constraint detail, so the schema is doing the work and baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with the concrete questions it answers (open date, attempts left, score) and then states the specific operation: listing up to 25 quizzes for one course with dates, time limit, attempt counts, and best grade. That is a precise verb+resource+scope. It does not differentiate itself from nearby siblings such as get_my_grades or get_course_grade_items, so it stops 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.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The framing questions and the worked example give a clear sense of when this tool is the right call (quiz timing/attempts/score for a single course), and it names get_my_courses as the prerequisite for obtaining course_id. There is no explicit when-not-to-use or routing to the grade-oriented siblings, which keeps it at 4.

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 nextA
Read-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?'

NameRequiredDescriptionDefault
course_idsNo
days_aheadNoHow many days ahead to look. Default 14.
overdue_daysNoHow many days back to include overdue work. Default 14.

TDQS

A4/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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 datesA
Read-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?'

NameRequiredDescriptionDefault
course_idsNo

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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. 5 tool updatesv0.1.10
    • Addedget_assignment_details
    • Addedget_calendar
    • Addedget_forum_discussions
    • Addedget_forum_posts
    • Addedget_quizzes
  2. 1 tool updatev0.1.9
    • Addedget_course_page
  3. 11 tool updatesv0.1.5
    • First observedget_announcements
    • First observedget_assignments
    • First observedget_course_content
    • First observedget_course_grade_items
    • First observedget_file
    • First observedget_missing_work
    • First observedget_my_courses
    • First observedget_my_grades
    • First observedget_overdue
    • First observedget_todo
    • First observedget_upcoming_due_dates

TDQS

A4/5.0

Scored across 17 tools

Disambiguation3/5

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.

Naming Consistency5/5

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.

Tool Count4/5

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.

Completeness4/5

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.

Maintenance

ActivityMaintained
ResponsivenessNo recent community issues

Related MCP Connectors

Related MCP Servers