moodle-mcp
Connects to a Moodle account using the Moodle mobile web-service API to retrieve courses, deadlines, assignments, grades, announcements, notifications, and course files. It can also read and search course content, extract text from course files, view discussions, and save or finalize assignment submissions.
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-mcpWhat's due in the next two weeks? Include 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 connects Claude to your Moodle account. From the chat you can ask what's due, have Claude open a reading or pull the text out of lecture slides, or check a grade.
It's about 950 lines of Python running on your own laptop. It signs in with the personal token Moodle gives its phone app and calls the same web-service API the app uses, so Claude sees what you'd see in the app and nothing more. It doesn't scrape pages or ask for your password.
It defaults tomoodle.trincoll.edu, but it works with any Moodle site that allows the Moodle mobile app. See Other schools.
Things to ask
What's due in the next two weeks? Include anything overdue.
Summarize this week's reading for my chemistry class.
What did my professors post in announcements this week?
Pull the text out of the latest lecture slides and quiz me on it.
What's my current grade in each class?
Find every file in my courses that mentions "midterm".Related MCP server: moodle-mcp
Quick start
You need uv, a fast Python installer. Skip this if you already have it.
# macOS / Linux
curl -LsSf https://astral.sh/uv/install.sh | sh# Windows (PowerShell)
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"1. Install
uv tool install git+https://github.com/ralstonraphael/moodle-mcpThis installs two commands, moodle for you and moodle-mcp for Claude. If your shell then says command not found, run uv tool update-shell and open a new terminal.
2. Sign in
moodle authmoodle auth explains where to find your token and then asks for it in a hidden prompt. In Moodle, click your avatar and go to Preferences > Security keys, press Reset on the Moodle mobile web service row, and copy the key it shows you. docs/getting-your-token.md has the full walkthrough and a second method for schools where that page is missing.
moodle whoami # prints your name if it worked
moodle due # what's coming up3. Connect Claude
claude mcp add -s user moodle -- moodle-mcpStart a new Claude Code session and ask "what's due this week?".
Open Settings > Developer > Edit Config and add the server:
{
"mcpServers": {
"moodle": {
"command": "/Users/YOUR-NAME/.local/bin/moodle-mcp"
}
}
}Put in the full path that which moodle-mcp prints (on Windows, where moodle-mcp, with each \ written as \\ in the JSON). Desktop apps don't always inherit your terminal's PATH, so a bare moodle-mcp may not be found. Quit and reopen Claude Desktop afterwards.
moodle-mcp is a standard stdio MCP server. Any client that can launch a local server can run it if you point it at the moodle-mcp command with no arguments.
Tools
Tool | What it does |
| Upcoming and overdue assignments and quizzes from your timeline |
| Your courses and their ids |
| Every section, activity, file and link in a course, with the section notes |
| Find activities, files and section text that mention a word |
| All assignments, sorted by due date, with submission status and grade |
| One assignment in full: instructions, attachments, time left, feedback |
| Open any page, file, folder, link, forum or quiz by its id |
| Text out of a PDF, Word, PowerPoint, Excel, HTML or plain-text file |
| Save a course file to |
| Grade items for one course, or totals for all of them |
| Latest posts in each course's Announcements forum |
| Every post in one forum thread |
| The bell-icon notifications: grades, feedback, reminders |
| Check the connection |
| List the raw API functions your token is allowed to call |
| Call any of those functions directly (the escape hatch) |
| Save a submission. Stays a draft unless you say to finalise |
The moodle command
The moodle command covers most of the same ground from a terminal, though submitting and forum threads are Claude-only. Put --json before any command for raw output.
moodle due [--days 14] [--back 14] upcoming + overdue
moodle courses [inprogress|future|past|all]
moodle assignments [COURSE_ID] with submission status and grade
moodle contents COURSE_ID sections + activities
moodle read CMID open any activity by its id
moodle grades [COURSE_ID]
moodle file FILEURL print a file's text
moodle download FILEURL [--to DIR]
moodle news | notifications | search QUERY
moodle functions [FILTER] what your token can call
moodle call WSFUNCTION '{"json": "params"}'
moodle logout delete the saved tokenSample output, with made-up courses:
$ moodle due --days 7
Thu Oct 22 2026 11:59 PM CHEM 111 Lab 5 report
https://moodle.example.edu/mod/assign/view.php?id=4821
Fri Oct 23 2026 5:00 PM ENGL 205 Essay draft 2
https://moodle.example.edu/mod/assign/view.php?id=4907
Sun Oct 25 2026 11:00 PM MATH 131 Quiz 4
https://moodle.example.edu/mod/quiz/view.php?id=5012A course id is the number incourse/view.php?id=…, and a cmid is the number in any mod/<type>/view.php?id=… link. Claude looks these up on its own, so you only need them for the CLI.
How it works
flowchart LR
claude["Claude<br/>(Code, Desktop, …)"] -- "MCP over stdio" --> server["server.py<br/>17 tools"]
you["You in a terminal"] --> cli["cli.py<br/>moodle command"]
server --> client["client.py<br/>Moodle client"]
cli --> client
client -- "HTTPS + your token" --> moodle[("Your school's Moodle<br/>webservice/rest/server.php")]
config["~/.config/moodle-mcp/config.json"] -. "token, mode 600" .-> clientEach request is a POST to Moodle's web-service API carrying your token and a function name, such as mod_assign_get_assignments.
File | Job |
One | |
Wraps those helpers as MCP tools with FastMCP. Claude reads each tool's docstring to decide when to call it, so the docstrings do real work. | |
The |
Make it your own
To add a tool, clone the repo and install it in editable mode so your commands run the code you're changing:
git clone https://github.com/ralstonraphael/moodle-mcp && cd moodle-mcp
uv tool install --force --editable .
moodle functions calendar # 1. find an API function
moodle call core_calendar_get_calendar_upcoming_view '{}' # 2. see what it returnsAdd a method to
client.pythat calls it and keeps the useful fields.Add a
@mcp.toolfunction inserver.pywith a clear docstring.Restart your Claude session and try it.
docs/extending.md walks through that calendar example line by line and ends with a list of ideas to build next. In Claude Code, the repo's CLAUDE.md describes the layout, so you can open the folder and ask for something like "add a tool that lists my upcoming calendar events".
uv run pytest # offline tests, no Moodle needed
uvx ruff check . # lint
npx @modelcontextprotocol/inspector moodle-mcp # click through the tools in a browserPrivacy and safety
Your token sits in
~/.config/moodle-mcp/config.json, readable only by your user account, and goes nowhere except your school's Moodle.moodle logoutdeletes it.The token can do anything the Moodle app can do as you, so keep it out of chats, group messages and repos. If it leaks, press Reset on the Security keys page and the old one stops working.
Anything a tool returns becomes part of your conversation with Claude, the same as text you paste in yourself.
Three tools can change things.
moodle_downloadsaves a file to your computer, whilemoodle_submit_assignmentandmoodle_callcan write to Moodle. The other fourteen only read.moodle_submit_assignmentsaves a draft unless you tell it to finalise, and its instructions tell Claude to show you the exact content before sending it.Check your course's AI policy before you use this on graded work.
Troubleshooting
Problem | Fix |
| Press Reset on the Security keys page and run |
No Moodle mobile web service row on Security keys | Sign in to the Moodle phone app once, then refresh the page |
| Run |
Claude doesn't list the tools | Start a new session after adding the server. In Claude Desktop, use the full path to |
| Your school has switched that function off. |
A file says it can't extract text | Use |
Other schools
moodle auth --url https://moodle.yourschool.eduYour school's Moodle has to allow the mobile app, so if the Moodle phone app signs you in, this will work too. Setting the MOODLE_URL and MOODLE_TOKEN environment variables works in place of moodle auth.
License
MIT. Not affiliated with Moodle Pty Ltd or any school.
Available Tools
17 toolsmoodle_announcementsBRead-only
Latest posts in each course's Announcements forum, newest first.
| Name | Required | Description | Default |
|---|---|---|---|
| course_ids | No | ||
| per_course | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint, so safety is covered. The description adds useful ordering ('newest first') and per-course scoping, but omits key behavior: what happens when course_ids is omitted, and how per_course limits results.
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?
A single compact sentence with the ordering fact front-loaded and no filler. It is arguably too terse for a two-parameter tool, but every word earns 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?
For a simple read-only list tool with no output schema, the description conveys the essential purpose, but with 0% schema coverage and no annotation detail on defaults, it leaves the parameter behavior unexplained. Adequate but with a clear 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?
Schema description coverage is 0%, so the description carries the full burden for both parameters — yet it never mentions course_ids or per_course. An agent cannot tell from the text that course_ids=null covers all courses or that per_course defaults to 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?
Names a specific resource (each course's Announcements forum) and the returned items (latest posts), which distinguishes it from moodle_discussion and moodle_search without opening schemas. It stops short of explicitly contrasting with those siblings, but the scope is unambiguous.
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?
No when-to-use guidance and no named alternative, even though moodle_discussion, moodle_search, and moodle_notifications are obvious competing sources for course posts. Usage is only implied by the resource named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
moodle_assignmentARead-only
One assignment in full: instructions, attachment files, dates, time remaining, accepted submission types, what's already submitted, grade and feedback. Pass assign_id or cmid.
| Name | Required | Description | Default |
|---|---|---|---|
| cmid | No | ||
| assign_id | No |
TDQS
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 adds genuine behavioral value by disclosing the returned payload (submission state, grade, feedback), which matters with no output schema present; it does not, however, mention permission/authentication requirements for viewing grades.
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?
Two sentences, no filler. The dense field enumeration is front-loaded and each listed item conveys distinct return content; the invocation sentence is short and follows naturally.
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 correctly carries the burden of describing return values and does so thoroughly. The remaining gap is the 0%-covered parameter pair, whose distinct meanings are not resolved, and no note on error behavior when neither identifier is given.
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 0% and neither parameter is required, so the description must compensate. It names both parameters and implies they are interchangeable ('Pass assign_id or cmid'), which is real added value, but it never explains what cmid is (course module id) versus assign_id, nor what happens if both or neither 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 resource and scope ('One assignment in full') and enumerates exactly what is returned: instructions, attachments, dates, submission types, submissions, grade and feedback. This singular, detail-level framing clearly distinguishes it from the plural sibling moodle_assignments and from moodle_deadlines.
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 only guidance is 'Pass assign_id or cmid,' which tells the agent how to invoke it, not when to choose it. There is no mention of when to prefer this over moodle_assignments, moodle_deadlines, or moodle_course_contents, and no prerequisites or exclusions are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
moodle_assignmentsBRead-only
All assignments in current courses (or the given ones), sorted by due date, with submission status (new/draft/submitted/nosubmission) and grade when include_status is true.
| Name | Required | Description | Default |
|---|---|---|---|
| only_open | No | ||
| course_ids | No | ||
| include_status | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnlyHint=true and openWorldHint=true, so the description's burden is lighter. It adds real behavioral context beyond the annotations: results are sorted by due date, and status values are enumerated (new/draft/submitted/nosubmission) along with the conditional inclusion of grades. It says nothing about pagination or result volume, which matters for an open-world list tool.
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?
A single, dense sentence with no filler, and the scope/sort/status details are ordered from most to least important. It is efficient, though the trailing 'when include_status is true' clause could be tightened.
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 reasonably sketches the returned fields (due date, status, grade), which is helpful. However, with three parameters at 0% schema coverage, leaving only_open undefined means an agent cannot know whether omitting it returns closed assignments too — a meaningful gap for a discovery tool.
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 0%, so the description must carry the parameter burden. It does explain include_status (adds submission status and grade when true) and partially explains course_ids ('or the given ones'), but only_open goes entirely unmentioned even though it narrows the result set implied by 'All assignments'.
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+resource (list assignments) with scope (current courses or explicitly given course_ids) and ordering (by due date). The 'All assignments' framing implicitly separates it from the singular moodle_assignment sibling, but no sibling is named outright, so the 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?
Usage is only implied: the description establishes the scope ('current courses (or the given ones)') from which an agent can infer this is the list-across-courses call versus the single-item sibling. There is no explicit when-to-use, no when-not-to-use, and no naming of alternatives such as moodle_assignment or moodle_deadlines.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
moodle_callADestructive
Escape hatch: call any Moodle web-service function the token allows, e.g. wsfunction='mod_quiz_get_quizzes_by_courses', params={'courseids': [123]}. Nested params are fine. Treat any function that writes (save/submit/update/delete/send) like a submission: confirm first.
| Name | Required | Description | Default |
|---|---|---|---|
| params | No | ||
| wsfunction | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, readOnlyHint=false and openWorldHint=true. The description adds genuinely new context: token-permission scoping, that nested params are accepted, and a heuristic that write-named functions should be treated like submissions and confirmed first. This reinforces rather than contradicts 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?
Three short sentences, front-loaded with the 'Escape hatch' framing, then a concrete example, then the safety rule. No filler and every sentence carries information.
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 an open-world, destructive tool with no output schema and no schema descriptions, the description covers purpose, when to use, parameter shape and the confirmation requirement. Error/failure behavior is not mentioned, but the essentials for calling it correctly are present.
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 0%, so the description must carry the load, and it does reasonably well: it defines wsfunction as any token-permitted Moodle function and supplies a concrete example with a real function name and nested params object. It does not spell out how invalid function names or malformed params are handled, leaving a small 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 ('call any Moodle web-service function') and frames itself as an 'escape hatch', which implicitly positions it as the generic fallback against the many specific siblings (moodle_grades, moodle_submit_assignment, etc.). It never names a sibling explicitly, so differentiation is implied rather than stated.
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 ('any function the token allows') and a concrete rule for write operations: confirm first for save/submit/update/delete/send. It stops short of an explicit exclusion like 'prefer the specific tools when one exists', which is the main guidance an agent needs for an escape hatch.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
moodle_course_contentsBRead-only
Every section of a course with its activities/resources (cmid, type, name, dates, files, links) and the section text (where teachers often put weekly readings and 'for next class' notes).
| Name | Required | Description | Default |
|---|---|---|---|
| course_id | Yes | ||
| include_descriptions | No |
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 disclosure about the response payload (sections, activity/resource fields, section body text), but says nothing about permissions, pagination, or payload size for a potentially large course.
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?
One compact sentence that leads with the scope ('every section of a course') and follows with the returned fields. No filler, though the parenthetical is long and slightly dense.
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 does a decent job sketching the return shape, and there is no annotation contradiction. It remains incomplete on the two input parameters and on behavior for large courses, which is the main gap for a read tool of this breadth.
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 0%, so the description carries the full burden — yet neither parameter is explained. course_id is never mentioned, and include_descriptions (default true) is only obliquely referenced via 'the section text', with no indication it can be turned off or what it controls.
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 the resource precisely — every section of a course plus its activities/resources — and enumerates the returned fields (cmid, type, name, dates, files, links). That distinguishes it from siblings like moodle_courses and moodle_assignments, though those siblings are never 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?
Usage is only implied: the parenthetical about section text holding weekly readings and 'for next class' notes hints at a use case, but there is no explicit when-to-use, no when-not, and no named alternative among the 17 siblings. An agent must infer that this is the tool for drilling into one course.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
moodle_coursesARead-only
List enrolled courses with their ids. which: inprogress (default) | future | past | all.
| Name | Required | Description | Default |
|---|---|---|---|
| which | No | inprogress |
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 real value by scoping results to *enrolled* courses and stating that ids are returned, but says nothing about ordering, pagination, or result size.
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?
Two sentences, front-loaded with the action and resource, with the parameter values compactly enumerated. No filler; every clause earns 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?
For a one-optional-parameter list tool with no output schema, the description covers what is returned (ids) and how to filter it. Only ordering/pagination and the precise semantics of each 'which' value are unaddressed, which is minor at this complexity.
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 0% and the schema has no enum, so the description carries the burden — it enumerates all four accepted values (inprogress | future | past | all) and marks the default. It does not explain what 'inprogress' means operationally (active vs. recently viewed), leaving a small 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 ('List') and resource ('enrolled courses') plus the returned field ('ids'), which cleanly separates it from moodle_course_contents and moodle_assignments. It never names a sibling alternative, so it stops short of full differentiation.
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 only implied: calling it returns the user's enrolled courses, and the 'which' values hint at the natural filtering cases. There is no explicit when-to-use statement, no prerequisites, and no pointer to alternatives such as moodle_deadlines or moodle_course_contents.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
moodle_deadlinesARead-only
Unfinished assignment/quiz deadlines from the Moodle timeline. days_back > 0 also returns overdue items. Dates here can lag edits teachers make; confirm critical ones with moodle_assignment.
| Name | Required | Description | Default |
|---|---|---|---|
| course_id | No | ||
| days_back | No | ||
| days_ahead | No |
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 behavioral context beyond that — data staleness ('dates can lag edits teachers make') and conditional result scope ('days_back > 0 also returns overdue items'). It does not mention auth requirements, result volume, or pagination, so it is good rather than exhaustive.
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?
Two short sentences, purpose front-loaded, no filler. The inclusion of the days_back rule in the opening sentence is slightly utilitarian rather than tidy, but every clause carries information.
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 and thin annotations, the description should do more: it never describes what a returned deadline entry contains or how results are ordered. It covers purpose, freshness caveat, and a cross-check path, which is adequate but leaves gaps an agent would need.
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 0%, so the description must carry the parameter burden. It explains days_back's behavioral effect well (values > 0 pull in overdue items), but course_id and days_ahead — including the default 14-day forward window — are left entirely unexplained.
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 resource (unfinished assignment/quiz deadlines) scoped to the Moodle timeline, which is a narrower thing than the sibling moodle_assignments' likely full assignment listing. It also names moodle_assignment as the tool to use for authoritative confirmation, so the agent can separate the two without opening a 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 for use (checking upcoming/overdue unfinished work) and explicitly routes the agent to moodle_assignment when a deadline is critical, which is the key decision point. It stops short of saying when this tool should not be used at all (e.g. for grades or announcements, which other siblings cover).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
moodle_discussionARead-only
All posts in one forum discussion (ids come from moodle_announcements / moodle_read on a forum).
| Name | Required | Description | Default |
|---|---|---|---|
| discussion_id | Yes |
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 only that it returns ALL posts (a scope/volume statement) but says nothing about ordering, pagination, truncation, or what a post object contains. Adequate but thin for a tool whose output could be large.
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?
A single front-loaded sentence with the core purpose first and the id-provenance hint parenthetically attached. No wasted words, though the parenthetical slightly interrupts the primary statement.
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 one-parameter read tool with no output schema, the description covers purpose, scope (all posts), and id provenance — enough to invoke correctly. Missing only return-shape/pagination detail, which is a minor gap at this complexity.
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 0% and the sole parameter has no description, so the description carries the full burden. It does so by explaining that discussion_id is obtained from moodle_announcements or moodle_read on a forum — a meaningful provenance hint beyond the bare 'integer' 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?
States the resource and scope precisely: 'All posts in one forum discussion' — an agent immediately knows this returns discussion content, not forums or announcements. It does not explicitly name a sibling it is not, but the scope is narrow enough to be unambiguous.
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 parenthetical tells the agent where to get the discussion id (moodle_announcements / moodle_read on a forum), which is a genuine workflow hint and better than nothing. However it never states when to prefer this tool over siblings like moodle_read or moodle_course_contents, nor any prerequisite beyond the id source.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
moodle_downloadB
Save a Moodle file to disk (default ~/Downloads/Moodle) and return the local path.
| Name | Required | Description | Default |
|---|---|---|---|
| fileurl | Yes | ||
| dest_dir | No | ~/Downloads/Moodle |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false, and openWorldHint=true, so the write-to-disk, non-destructive, network-bound profile is covered. The description adds the default target directory and the returned local path, but says nothing about overwrite behavior, permissions, or failure modes.
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?
A single front-loaded sentence with zero filler that names the action, the default location, and the return value. Nothing to trim.
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 usefully states that the local path is returned, and annotations cover the safety profile. However, for a 2-param tool with 0% schema coverage it omits how to obtain fileurl and what happens on existing files or errors.
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 0%, so the description must carry parameter meaning and largely does not. It implies fileurl is a Moodle file URL and repeats the dest_dir default already present in the schema, but gives no format, provenance, or validation detail for the required fileurl.
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+resource ('Save a Moodle file to disk') plus the default destination and the return value (local path). This clearly differentiates it from read-oriented siblings like moodle_read and moodle_file_text, though it does not name them 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?
No guidance on when to download versus reading a file with moodle_read or moodle_file_text, and no note on where the required fileurl comes from (e.g., moodle_course_contents). Usage is only implied by the verb 'Save'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
moodle_file_textARead-only
Text of a Moodle file (PDF, DOCX, PPTX, XLSX strings, HTML, plain text) from a fileurl returned by
another tool. Long files come back in slices: call again with offset to continue.
| Name | Required | Description | Default |
|---|---|---|---|
| offset | No | ||
| fileurl | Yes | ||
| max_chars | No |
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 genuinely new behavioral context: the paginated slice/offset model and the set of accepted file formats, which the agent cannot get from annotations. It omits what happens on truncation boundaries and how slices are delimited.
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?
Two compact sentences, front-loaded with the resource and formats, followed by the pagination rule. Nothing is wasted and no sentence merely restates the tool name.
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 does provide some return-value context (text, delivered in slices) and the chaining precondition. It would be fully complete if it described the slice response shape (e.g. whether an offset/end marker is returned) and the `max_chars` truncation control.
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 0%, so the description carries the burden. It explains two of the three parameters: `fileurl` (provenance from another tool) and `offset` (resume the slice). The `max_chars` parameter and its 40000 default are never mentioned, leaving a real gap in the contract.
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+resource (extracting text from a Moodle file) and enumerates supported formats (PDF, DOCX, PPTX, XLSX, HTML, plain text), so the purpose is unmistakable. It does not, however, differentiate itself from siblings that also touch files, such as moodle_read or moodle_download, leaving the agent to infer which one to reach for.
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?
Clearly specifies the precondition — the `fileurl` must come from another tool — and gives explicit continuation guidance ('call again with offset to continue') for long files. It stops short of naming alternatives or stating when a different sibling (e.g. moodle_download or moodle_read) would be preferable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
moodle_functionsARead-only
Names of the Moodle web-service functions this token can call (filter with match, e.g. 'calendar').
Use it to find a function for moodle_call when no dedicated tool fits.
| Name | Required | Description | Default |
|---|---|---|---|
| match | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint, covering the safety profile. The description adds token-scoped permissions ('this token can call'), which is useful auth context, but omits result size, pagination, or matching behavior; with annotations doing the heavy lifting, this is adequate but not rich.
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?
Two sentences, front-loaded with identity and followed by routing guidance; no filler. The filter example is tucked into parentheses without disrupting flow.
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 one-parameter discovery tool with no output schema, the description conveys what is returned (function names) and how to narrow results. It lacks detail on result format or pagination, but nothing essential is missing for correct invocation.
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 0% and the single `match` parameter has no description in the schema. The description compensates by explaining it as a filter with a concrete example, which is meaningful beyond the schema's bare title and default.
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 the exact resource (Moodle web-service function names available to this token) and its role as a discovery index for moodle_call. It clearly distinguishes itself from all sibling action tools by being a read-only listing rather than an action executor.
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?
Explicitly says to use it when no dedicated tool fits and names moodle_call as the consumer, so the agent knows when to select it over siblings. The filter example ('calendar') gives immediate operational guidance on the one parameter.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
moodle_gradesARead-only
Grade items for one course (grade, max, %, weight, feedback). Without course_id: course totals for all courses.
| Name | Required | Description | Default |
|---|---|---|---|
| course_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnlyHint and openWorldHint, so the safety profile is known. The description adds real behavioral value by disclosing the returned field set and the behavior shift when course_id is omitted (aggregate totals instead of per-course items).
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?
Two tight sentences, front-loading the primary behavior and then the fallback mode, with zero 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 single-optional-param read tool with annotations covering safety and no output schema, the description supplies what an agent needs: the resource, the return fields, and the conditional behavior. Minor gaps (formatting/pagination) are not critical here.
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 0% and the schema only labels the param 'Course Id'. The description meaningfully compensates by explaining that supplying course_id scopes results to one course and omitting it returns totals for all courses.
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 resource (grade items) and the fields returned (grade, max, %, weight, feedback), and distinguishes its two modes. Among the siblings, no other tool handles grades, so the resource specificity carries the differentiation.
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?
Clearly frames the two calling contexts: with course_id it returns one course's grade items, without it returns course totals across all courses. There are no alternatives named, but the conditional usage is explicit enough to guide the call.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
moodle_notificationsCRead-only
The bell-icon notifications: new grades, feedback, forum posts, due-date reminders.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| unread_only | No |
TDQS
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 adds nothing behavioral beyond that: no mention of pagination, ordering, recency window, or what unread versus read state means in the result. It does not contradict the annotations, but it contributes no context they don't already 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?
It is a single short fragment with no filler, so it is compact and front-loaded. But brevity here comes from under-specification rather than discipline — a verb and a clause about what is returned would cost little and add much.
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 simple two-parameter read tool with annotations covering the safety profile, the content-type list is genuinely useful context. Still missing: the action performed, any parameter guidance, and result shape (no output schema exists to cover it), leaving real gaps for an agent deciding whether to call this or a sibling.
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 0% for two parameters (limit, unread_only), so the description must compensate and does not. 'limit' and 'unread_only' are relatively self-explanatory names, but the description never mentions either, nor any default (limit=20), ordering, or what 'unread' scopes to.
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 the resource ('the bell-icon notifications') and enumerates the content types it carries, which helps distinguish it from siblings like moodle_announcements or moodle_deadlines. However, it is a bare noun phrase with no verb — it never says whether the tool lists, fetches, marks, or dismisses notifications. An agent must infer the action, so the purpose is only implied.
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?
There is no when-to-use guidance and no mention of alternatives, even though siblings such as moodle_deadlines (due dates) and moodle_announcements overlap with the content types listed here. The agent is left to guess whether notifications or those dedicated tools should be preferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
moodle_readARead-only
Open any activity/resource by cmid and return its readable content: page text, file list for resources/folders, link target for URLs, assignment detail, forum discussions, quiz dates/attempts.
| Name | Required | Description | Default |
|---|---|---|---|
| cmid | Yes |
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 return-content detail by resource type, but does not disclose auth requirements, enrollment constraints, or rate limits.
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 definition is one front-loaded sentence with a compact list of return types. It is appropriately sized and wastes no words.
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?
No output schema exists, so the description carries the burden of describing return values, which it does for multiple activity types. It is largely complete for invocation, though usage guidance and cmid semantics remain thin.
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 0% for the single cmid parameter. The description mentions cmid as the identifier for the activity/resource, giving partial semantic context, but does not define its format or relationship to course/module IDs.
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: open any activity/resource by cmid. It also lists the readable content returned for several resource types. It does not explicitly distinguish itself from siblings like moodle_assignment or moodle_discussion.
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: use this when you have a cmid and want readable content for an activity/resource. There is no explicit when-not guidance or named alternative tool to choose instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
moodle_searchBRead-only
Find activities, files and section text mentioning query across current courses (or the given ones).
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | ||
| course_ids | No |
TDQS
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 usefully adds what is actually searched (activities, files, section text) and the default scoping to current courses, but omits result limits, pagination, or match semantics (substring vs fuzzy).
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?
A single front-loaded sentence with no filler; the scope parenthetical is the only compressed element. Every clause conveys information the 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?
For a read-only search tool with two parameters, this is close to adequate, but with no output schema an agent still lacks any sense of result shape, ordering, or cap. The description covers scope but not the outcome of the call.
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 0%, so the description must compensate: it does explain that `query` is the term to match and that `course_ids` defaults to 'current courses' when not supplied. It adds no syntax or type detail beyond that, leaving the parameter contract thin for a zero-coverage 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 ('Find') and concrete resources ('activities, files and section text') plus the search scope. It is clear enough to distinguish from content-fetching siblings like moodle_read or moodle_course_contents, though it does not name them.
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 by the phrase 'across current courses (or the given ones)', which tells the agent this is a keyword search scoped to enrollment. However, no explicit when-to-use, when-not-to-use, or named alternative (e.g. moodle_course_contents for browsing) is given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
moodle_submit_assignmentADestructive
Save the user's submission for an assignment: online text (HTML) and/or local files. This REPLACES the current submission's text/files. Leaves it as a draft unless submit_for_grading=true, which finalises it (and accepts the submission statement). Only call after the user has approved the exact content.
| Name | Required | Description | Default |
|---|---|---|---|
| assign_id | Yes | ||
| text_html | No | ||
| file_paths | No | ||
| submit_for_grading | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true and openWorldHint=true; the description adds the crucial specifics that the call REPLACES existing text/files, that the default leaves a draft, and that submit_for_grading finalises and accepts the submission statement. Missing only auth/error behavior, which is minor here.
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 tight sentences, all load-bearing: what it does, the destructive replacement semantics, and the approval precondition. Front-loaded with the operation before the caveats.
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 destructive mutation with no output schema, the description covers the essential behavioral facts an agent needs before invoking. It omits only edge details like failure handling or whether a prior draft is retrievable, which are secondary.
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 0%, so the description must carry the load. It maps text_html to 'online text (HTML)' and file_paths to 'local files', and fully explains submit_for_grading's default and effect; only assign_id is left implicit, which is low risk.
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 (Save/submit) and resource (user's submission for an assignment), plus the two content channels it accepts. No sibling tool offers submission, so the agent can distinguish it immediately.
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 precondition ('Only call after the user has approved the exact content') and explains the draft-vs-finalise decision via submit_for_grading. It does not name an alternative sibling for read-only assignment inspection, but the when-to-use condition is explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
moodle_whoamiARead-only
Check the connection: site name, Moodle version, and the logged-in user.
| 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 safety is covered. The description adds value by disclosing the return payload (site name, version, authenticated user), which matters because no output schema exists; it stops short of saying what happens when the connection or auth fails.
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?
One front-loaded sentence that identifies the action first and the returned fields second, with no filler or 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 zero parameters, a fully covered (empty) schema, and annotations carrying the read-only/open-world profile, the description supplies the missing return-value detail. Only the failure/error behavior when the connection is bad is left unstated.
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 schema has nothing to document and the baseline of 4 applies. The description correctly implies no inputs are needed to invoke 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?
States a specific verb (check) and resource (connection) and enumerates exactly what it reports: site name, Moodle version, logged-in user. This clearly separates it from data-oriented siblings like moodle_courses or moodle_grades, though it never names an alternative 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?
Usage is only implied by the phrase 'Check the connection' – an agent can infer this is a connectivity/auth smoke test to run before other calls, but there is no explicit when-to-use, when-not-to-use, or named alternative.
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.
17 tool updates
v0.1.0- First observed
moodle_announcements - First observed
moodle_assignment - First observed
moodle_assignments - First observed
moodle_call - First observed
moodle_course_contents - First observed
moodle_courses - First observed
moodle_deadlines - First observed
moodle_discussion - First observed
moodle_download - First observed
moodle_file_text - First observed
moodle_functions - First observed
moodle_grades - First observed
moodle_notifications - First observed
moodle_read - First observed
moodle_search - First observed
moodle_submit_assignment - First observed
moodle_whoami
TDQS
Scored across 17 tools
Most tools target distinct resources, but moodle_read is a broad catch-all that overlaps with moodle_assignment, moodle_course_contents, moodle_discussion, and moodle_file_text. The three deadline/assignment tools (moodle_assignment, moodle_assignments, moodle_deadlines) also share territory, though descriptions mostly disambiguate them.
All tools share a clean moodle_ prefix and snake_case, which makes them easy to scan. There is a minor mix of noun phrases (moodle_courses, moodle_grades) and verbs (moodle_read, moodle_search, moodle_submit_assignment), but the pattern stays predictable.
17 tools is slightly heavy but justified for an LMS surface spanning courses, assignments, grades, files, forums, and notifications. Each tool covers a meaningful slice of the domain rather than redundant trivia.
Read/lifecycle coverage is strong (courses, contents, assignments, grades, files, forums, announcements, notifications) plus submission. Write operations beyond submit are thin, but moodle_functions and moodle_call provide an escape hatch for any missing web-service function.
Maintenance
Related MCP Connectors
- platform7nOAuthtech.p7n
Connect Claude to your Platform7n workspaces — chat, links, and tasks. One-click OAuth.
Multiple Google accounts (Gmail, Calendar, Drive, Contacts, Tasks) in one Claude connector.
Multiple Google accounts (Gmail, Calendar, Drive, Contacts, Tasks) in one Claude connector.
Give Claude only the Google Drive files you choose. Every action logged.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceConnects Claude to Canvas LMS, enabling students to query their coursework, assignments, grades, deadlines, announcements, and calendar events through natural conversation instead of navigating the Canvas interface.8-
- AlicenseNot gradedqualityCmaintenanceProvides Claude with full access to Moodle learning management systems, enabling interaction with courses, files, assignments, grades, and calendar events. It also supports building Obsidian study vaults from course materials through automated knowledge graph creation.20 npm18MIT
- FlicenseNot gradedqualityDmaintenanceConnects Claude AI to your Canvas LMS account, enabling natural language interaction with coursework including assignments, grades, announcements, and calendar.-
- FlicenseNot gradedqualityDmaintenanceConnects Claude to the Canvas LMS REST API, enabling natural language queries about courses, assignments, grades, deadlines, and announcements.1-