sernobre-moodle-mcp
This server lets AI agents manage Moodle courses and content via the Web Services API, with idempotency and a companion plugin. Key capabilities:
Course Management: Create, update, duplicate, archive, and list courses; manage course context.
Section Management: Create, update, hide, release, reorder, duplicate, move, and delete sections.
Content Publishing: Publish Markdown lessons as sections (idempotent), with preview & confirm workflow; delete resources; generate and embed AI videos.
Assessment & Quizzes: Configure quiz shells, import GIFT questions, modify questions, publish exam lessons, list quiz questions.
Communication: Create forums and announcements, send private messages, get site info and activity logs.
Gradebook & Completion: Retrieve grades, activity completion, quiz attempts, submissions; manually grade assignments.
User & Group Management: List enrolled users, batch-enrol from CSV, unenrol, role changes, group creation and assignment, password resets.
Calendar & Badges: Create/manage calendar events with recurrences; list user badges.
System & Utility: Call any Moodle Web Service function via
ws_raw; configurable rate limiting, retries, and timeouts.
Allows AI agents to manage Moodle pedagogical content: create/update/duplicate/archive courses, manage sections, publish lessons and resources idempotently, create quizzes from GIFT files, manage students, query grades/completion/submissions, create forums/calendar events, send messages, issue badges, and read logs via Moodle Web Services API.
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., "@sernobre-moodle-mcpcreate a quiz from the GIFT file for Chapter 4"
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.
sernobre-moodle-mcp
Model Context Protocol (MCP) server for Moodle. Lets AI agents (Claude, etc.) publish and manage pedagogical content — lessons, resources, activities, quizzes, forums — directly in Moodle via the Web Services API, with guaranteed idempotency.
This project grew out of marcosnahuel/moodle-mcp. What began as a fork has since been rebuilt from the ground up — translated to English, hardened with bug fixes, and reshaped around our own teaching workflow — so it now stands as an independent codebase while keeping the spirit of the original:
Rewritten in English — every tool, parameter and error message (the original project was in Spanish);
Bug fixes — hardening across the publishing and question-editing flows;
A rewritten companion plugin — the original's
local_italiciamcpbecamelocal_sernobre_mcp, with its own Web Service endpoints.
Credits — our thanks to Marcos Nahuel for creating the original
moodle-mcp, which laid the groundwork for this project: https://github.com/marcosnahuel/moodle-mcp
What is this?
sernobre-moodle-mcp is an MCP server in TypeScript/Node.js that exposes a set of tools that an AI agent can call to interact with a Moodle instance:
create / update / duplicate / archive courses;
manage sections and reorganize content;
publish lessons and resources (idempotent);
create quizzes from GIFT files;
manage students (enrolment, groups, role changes, password resets);
query grades, completion, submissions and attempts;
create forums, calendar events and send messages;
issue badges and read logs.
Besides the TS wrapper, the repository includes a companion Moodle plugin (local_sernobre_mcp) that adds extra Web Service endpoints (e.g. upsert_quiz, upsert_page, add_questions_gift) needed by some tools.
Related MCP server: Moodle MCP Server
Project status
Component | Version |
TypeScript wrapper ( | v0.1.0 |
Moodle plugin ( | v0.8.8 |
See CHANGELOG.md for the full history of changes and migration notes.
Features
Guaranteed idempotency — publishing the same content twice never creates duplicates.
Translated to English — all tools, parameters and error messages are in English (the original project was in Spanish).
Bugs fixed — several fixes compared to the original project, notably in the
upsert_quiz,upsert_page,add_questions_giftflows and in question editing on Moodle 5.x.Configurable rate limiting, retries and timeout.
Structured logging (JSON per line) with automatic token redaction.
Companion Moodle plugin with its own Web Service endpoints.
Architecture
┌─────────────┐ MCP (stdio) ┌──────────────────────┐ HTTPS JSON ┌──────────────┐
│ AI Agent │ ───────────────► │ sernobre-moodle-mcp │ ─────────────► │ Moodle │
│ (Claude, …) │ │ MCP server │ │ Web Services │
└─────────────┘ └──────────────────────┘ └──────────────┘
│ HTTPS JSON
▼
┌──────────────────────────┐
│ local_sernobre_mcp │
│ plugin (extra endpoints)│
└──────────────────────────┘Requirements
Node.js ≥ 20
A Moodle 4.x or 5.x instance with Web Services enabled
A Web Service token for a user with
editingteacherormanagerpermissions
Installation & configuration
1. Prerequisites
Node.js ≥ 20 (check with
node --version)npm (comes with Node.js)
A Moodle 4.x or 5.x instance that you administer
A Moodle user with
editingteacherormanagerpermissions on the courses you want to manage
2. Install the wrapper
git clone https://github.com/sernobre/moodle-mcp.git
cd moodle-mcp
npm install
npm run buildThis produces the compiled server in dist/ and the sernobre-moodle-mcp binary.
3. Configure environment variables
The server reads its configuration from environment variables. At minimum you must set MOODLE_URL and MOODLE_WS_TOKEN; everything else has sensible defaults.
Variable | Required | Description |
| Yes | URL of the Moodle instance (must be HTTPS, except in development) |
| Yes | Moodle Web Service token (see step 4) |
| No | Timeout per request (default: |
| No | Number of retries (default: |
| No | Requests per second limit (default: |
| No |
|
| No |
|
Set them in your shell before starting the server:
PowerShell (Windows):
$env:MOODLE_URL = "https://your-moodle.example.com"
$env:MOODLE_WS_TOKEN = "paste-your-token-here"
$env:MCP_LOG_LEVEL = "info"bash / zsh (Linux, macOS):
export MOODLE_URL="https://your-moodle.example.com"
export MOODLE_WS_TOKEN="paste-your-token-here"
export MCP_LOG_LEVEL="info"Or create a .env file and load it in your shell (the project does not auto-load .env files — use a dotenv launcher or export them yourself).
4. Configure Moodle (Web Services) — one-time
Follow these steps on the Moodle side before first use:
Site administration → Server → Web services — enable web services and the REST protocol.
Install/update the companion plugin in step 6 below. During the upgrade, Moodle creates the pre-built Sernobre MCP external service with the MCP function allowlist.
Open External services → Sernobre MCP and keep Authorised users only enabled. Add only the dedicated MCP user.
Under Manage tokens, create a token for that user and select the Sernobre MCP service. A token created for another service is not interchangeable.
The pre-built service includes these core functions:
core_webservice_get_site_infocore_files_uploadmod_assign_save_submissionmod_assign_submit_for_gradingcore_course_get_courses_by_fieldcore_course_get_contentscore_course_create_coursescore_course_update_coursescore_course_edit_sectioncore_course_edit_modulecore_enrol_get_enrolled_userscore_calendar_create_calendar_eventscore_calendar_get_calendar_eventscore_calendar_update_event_start_daycore_calendar_get_allowed_event_typesmod_forum_get_forums_by_coursesmod_forum_add_discussionall
local_sernobre_mcp_*functions declared by the companion plugin
The token user should have a dedicated least-privilege role in the system or relevant course-category context with these capabilities:
moodle/course:createmoodle/course:updatemoodle/course:viewmoodle/course:manageactivitiesmoodle/user:manageownfiles(needed by Moodle core_files_upload for the current token user)mod/assign:submitmoodle/course:movesectionsmoodle/course:sectionvisibility(only when calling the deprecated core section show/hide API directly)moodle/question:addenrol/manual:configmoodle/calendar:manageentriesmoodle/calendar:manageownentriesmoodle/calendar:managegroupentriesmod/forum:viewdiscussionmod/forum:startdiscussionwebservice/rest:use
mod/forum:pindiscussions is additionally needed when announcements must be pinned. The companion-plugin section endpoint local_sernobre_mcp_update_section requires moodle/course:update; it is the preferred route for MCP section edits. The destructive core_calendar_delete_calendar_events function is intentionally not in the pre-built service.
For another existing Moodle function, open Site administration -> Plugins -> Web services -> External services -> Sernobre MCP -> Functions -> Add functions. Add only functions needed by the deployment; this allowlist does not replace the capability checks of the token user.
Add moodle/category:manage only when the MCP user must manage categories. Course deletion is deliberately not exposed by the built-in service; add core_course_delete_courses manually only after a separate review.
Audit tip: create a dedicated user such as
moodle-mcp-bot, assign the minimum role above only where needed, restrict the token by IP when possible, and set a validity date.
5. Start the server
npm startThe server starts, emits a server.start log line, and waits for MCP traffic over stdio. Logs are JSON per line on stderr; tokens are automatically redacted.
6. Install the companion plugin
Some tools need the local_sernobre_mcp Moodle plugin (plugin-companion/local_sernobre_mcp.zip):
Upload/unzip the archive into
<moodle-root>/local/.Go to Site administration → Notifications to complete the install/update. The version bump also registers or updates the pre-built Sernobre MCP service.
Use that service when creating the token. Do not create a second service unless you intentionally want a different function allowlist.
If the server is already running, restart it after updating the plugin.
7. Smoke test
Run the wrapper in a terminal and ask your MCP client to call ws_raw with core_webservice_get_site_info. If you get back your Moodle site name, the wiring is correct. A token error means step 4 needs checking; an HTTP 404 usually means MOODLE_URL has a trailing slash or a /webservice/... suffix (the wrapper appends that itself).
8. Connect an MCP client
Claude Desktop — add this to claude_desktop_config.json (Windows: %APPDATA%\Claude\claude_desktop_config.json; macOS: ~/Library/Application Support/Claude/claude_desktop_config.json):
{
"mcpServers": {
"moodle": {
"command": "npx",
"args": ["-y", "sernobre-moodle-mcp"],
"env": {
"MOODLE_URL": "https://your-moodle.example.com",
"MOODLE_WS_TOKEN": "paste-your-token-here",
"MCP_LOG_LEVEL": "info"
}
}
}
}To use your local build instead of the published package, point command at node with args: ["K:\\Formação\\moodle\\moodle-mcp-sernobre\\dist\\index.js"].
Restart Claude Desktop and confirm the moodle server is listed as connected. See the full guide in examples/setup-claude-desktop.md.
Codex (CLI) — Codex configures MCP servers as TOML tables in ~/.codex/config.toml (user-wide) or .codex/config.toml (project-scoped, trusted projects only). You do not run npm start yourself — Codex launches the server as a subprocess.
Run the published package from npm:
[mcp_servers.moodle]
command = "npx"
args = ["-y", "sernobre-moodle-mcp"]
env = { MOODLE_URL = "https://your-moodle.example.com", MOODLE_WS_TOKEN = "paste-your-token-here", MCP_LOG_LEVEL = "info" }
startup_timeout_sec = 20Or add it with the Codex CLI (recommended — it writes the TOML for you):
codex mcp add moodle --env MOODLE_URL=https://your-moodle.example.com --env MOODLE_WS_TOKEN=your-token -- npx -y sernobre-moodle-mcpTo use your local build instead of the published package, set command = "node" with args = ["K:\\Formação\\moodle\\moodle-mcp-sernobre\\dist\\index.js"].
Notes:
Rebuild with
npm run buildafter any source change if you use the localdist/index.jspath.Use an absolute path to
nodeif Codex cannot find it on PATH.Rather than hardcoding the token in
env, you can forward it from your shell withenv_vars = ["MOODLE_WS_TOKEN"]and export it before launching Codex.Verify with
codex mcp list; raisestartup_timeout_secif the server boots slowly.
Other MCP clients — configure the client to launch npx -y sernobre-moodle-mcp (or node dist/index.js for a local build) over stdio with the same environment variables. The server exposes its tools via the standard MCP tools/list and tools/call capabilities.
Available tools
Courses
create_course, update_course, duplicate_course, archive_course, list_my_courses, get_course_context
Sections
create_section, update_section, create_sections, delete_sections, move_section, get_sections, update_sections, duplicate_section, reorder_sections, hide_section, release_section
Content
publish_class_lesson, create_activity, update_activity, publish_preview, confirm_preview, delete_resource, generate_video
Assessment
configure_quiz, create_quiz, update_quiz, import_gift, modify_question, get_quiz_questions, publish_exam_lesson
Communication
create_forum, create_forum_announcement, send_moodle_message, get_site_info, get_course_logs
Gradebook
get_grades, get_assign_submissions, get_assignment_config, get_completion, get_quiz_attempts, grade_manually, submit_assignment_file
Students
list_students, enrol_csv, unenrol_student, change_role, groups, reset_password
Other
list_user_badges, create_calendar_event, update_event, delete_event, list_calendar_events, ws_raw
Lesson example
The repository includes a Markdown lesson example in examples/lesson-example.md, used with the publish_class_lesson tool.
Development
npm run dev # watch build
npm run typecheck # type checking
npm run test # unit tests
npm run test:integration # integration tests (requires Moodle)
npm run build # production buildRepository structure
src/ # TypeScript wrapper (MCP server)
tools/ # tool implementations
client/ # Moodle Web Services API client
schemas/ # validation (zod)
utils/ # idempotency, logging, rate limit, markdown→HTML
plugin-companion/ # Moodle plugin local_sernobre_mcp (PHP)
docs/ # technical docs and roadmap
examples/ # examples (lesson, Claude Desktop setup)
tests/ # testsLicense
MIT — see LICENSE.
The original code this project is based on belongs to marcosnahuel/moodle-mcp.
Available Tools
45 toolsarchive_courseA
Archive (visible=0) or un-archive (visible=1) a course. Non-destructive: data, enrolments and teacher access stay intact. Use it for end-of-year cleanup or hiding a course in preparation.
| Name | Required | Description | Default |
|---|---|---|---|
| visible | No | false = archive/hide, true = unarchive/show | |
| course_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Since no annotations are provided, the description carries the full burden. It discloses that the tool is 'Non-destructive: data, enrolments and teacher access stay intact,' which is valuable behavioral context beyond the schema. It also implies reversibility by mentioning un-archiving. It could add permission requirements or edge-case behavior, but this is adequate for a simple toggle.
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 description is two sentences long, front-loaded with the action, and every sentence adds value. There is no redundant or filler content.
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 2-parameter toggle tool with no output schema, the description covers the purpose, use case, and non-destructive nature. It lacks mention of permission requirements or behavior when the course is already in the requested state, but given the tool's simplicity, the provided context is sufficient for an agent to use it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already documents the 'visible' parameter with 'false = archive/hide, true = unarchive/show', and the description mostly restates that. The 'course_id' parameter has no schema description and is not explained in the description, relying on the name for inference. With 50% schema description coverage, the description does not significantly compensate for the missing course_id semantics, so a baseline score of 3 is appropriate.
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 clearly states the tool's function: 'Archive (visible=0) or un-archive (visible=1) a course.' It uses specific verbs and identifies the resource, distinguishing it from similar operations like delete_resource or hide_section. The two modes are explicitly defined.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit use cases: 'Use it for end-of-year cleanup or hiding a course in preparation.' This tells the agent when to use the tool. However, it does not mention when not to use it or name alternative tools, so it falls short of a full 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
assign_to_groupA
Add one or more users to a group by group_id.
| Name | Required | Description | Default |
|---|---|---|---|
| group_id | Yes | ||
| user_ids | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It only states the operation without mentioning side effects, error conditions, whether existing group memberships are preserved, or if the operation is atomic. This lack of transparency is a significant gap for a mutation 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?
The description is a single, front-loaded sentence with no unnecessary words. It efficiently communicates the core action without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with two simple parameters and no output schema, the description covers the basic action but omits important context such as the need for existing groups/users, expected behavior on duplicates, and error handling. Given the lack of annotations, additional context would improve completeness.
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 description mentions 'group_id' and 'users' which map to the schema's group_id and user_ids parameters, but it does not explicitly use the parameter names or add meaningful detail about their format or constraints. With 0% schema description coverage, the description should compensate more by explaining the relationship and potential requirements.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses the specific verb 'Add' and clearly identifies the resource ('users') and target ('a group by group_id'). This distinguishes it from sibling tools such as create_group, which focuses on creating groups rather than adding users to existing ones.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly conveys the tool's purpose: associating one or more users with a specific group. It implies use when the group already exists and users need to be added, but it does not explicitly mention alternatives or exclusions, such as not using it when creating a new group.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
change_roleA
Assign a course-level role to a user (student / teacher / editingteacher / manager). Does NOT unassign previous roles — Moodle supports multiple roles per user per context.
| Name | Required | Description | Default |
|---|---|---|---|
| user_id | Yes | ||
| new_role | Yes | ||
| course_id | Yes | ||
| context_level | No | Only course-level role assignment is supported in v0.5. | course |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It transparently states that previous roles are not unassigned and explains Moodle's multi-role-per-context behavior, which is critical for a mutation tool. It could be improved by mentioning permissions or failure modes, but the key side effect is clearly disclosed.
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 description is two sentences with no filler. The first sentence states the action and allowed roles; the second adds the critical caveat. Information is front-loaded, and 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 tool with 4 parameters and no output schema, the description covers the main action and a crucial behavioral nuance, but it omits aspects like permission requirements, expected return value, and the v0.5 course-level-only limitation (which appears only in the schema description). It is adequate but not fully comprehensive.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema description coverage is only 25%, so the description needs to compensate. It adds meaning for new_role by enumerating the accepted values and clarifies context_level as 'course-level'. However, it does not explain user_id or course_id beyond their names, which are intuitive but not explicitly defined. The description partially bridges the schema 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?
The description uses a specific verb ('Assign') and resource ('course-level role to a user'), and explicitly lists the supported roles. It clearly distinguishes the tool from sibling tools like enrol_csv by focusing on role assignment rather than enrolment. The added note about not unassigning previous roles further sharpens its purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use the tool by noting that it does NOT unassign previous roles, indicating a use case where retaining existing roles is important. However, it does not explicitly state alternatives or contrast with sibling tools like enrol_csv or unenrol_student, so the guidance is mostly implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
configure_quizA
Create or update a quiz shell (no questions). Idempotent by slug. Default: hidden, unlimited attempts, grade=10, method=highest. The plugin resolves section_num (section number) to section ID internally. Combine with import_gift to populate questions, or use publish_exam_lesson for both in one call.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| slug | Yes | Stable key used to build the quiz idnumber | |
| grade | No | ||
| intro | No | ||
| visible | No | ||
| attempts | No | ||
| timeopen | No | ||
| course_id | Yes | ||
| timeclose | No | ||
| grademethod | No | highest | |
| section_num | No | Section NUMBER (0 = General, 1..N = topics). Will be resolved to section ID by the plugin. | |
| timelimit_seconds | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of behavioral disclosure. It reveals idempotency, defaults (hidden, unlimited attempts, grade=10, method=highest), and internal slug-to-ID resolution for section_num. However, it does not clarify whether an existing quiz is updated via merge (keeping unspecified fields) or by resetting to defaults, leaving a notable ambiguity for an upsert operation.
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 description is four sentences, each carrying distinct value: purpose, idempotency + defaults, internal resolution, and usage workflow. It is front-loaded, concise, and contains no filler or repetition of schema 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?
Given the complexity of a 12-parameter tool with no output schema and no annotations, the description gives a strong high-level overview and workflow, but it lacks details on update behavior (merge vs. overwrite), return values, and prerequisites like permissions. These gaps could confuse an agent when invoking the tool for updates or edge cases.
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 only 17%, so the description must compensate. It explicitly maps defaults for visible (hidden), attempts (unlimited/0), grade (10), grademethod (highest), and explains that section_num is resolved by the plugin. The remaining parameters (timeopen, timeclose, timelimit_seconds) are not mentioned, but their names are reasonably self-explanatory, and the description adds significant meaning for the most critical ones.
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 opens with 'Create or update a quiz shell (no questions)' — a specific verb, resource, and a clear exclusion of question content. It distinguishes this tool from siblings like import_gift and get_quiz_questions by explicitly stating it handles the quiz shell only and pointing to publish_exam_lesson for combined functionality.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit usage guidance: 'Combine with import_gift to populate questions, or use publish_exam_lesson for both in one call.' It also states idempotency by slug, signaling it can be used for both creation and updates. This clearly tells the agent when to use this tool versus alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
confirm_previewA
Make a previewed section visible to students. Propagates visibility to all modules inside the section. Idempotent.
| Name | Required | Description | Default |
|---|---|---|---|
| course_id | Yes | ||
| section_id | Yes | ||
| resource_ids | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden. It discloses two important behaviors: 'Propagates visibility to all modules inside the section' (side effect) and 'Idempotent' (repeatability). This goes beyond the basic action, though it does not mention prerequisites like whether the section must already be in preview state or potential 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?
The description is three concise sentences, each contributing unique information: the core action, the propagation effect, and idempotency. It is front-loaded with the most important information and contains no filler or repetition.
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?
The tool is relatively simple, but the description omits guidance on parameter usage (especially resource_ids) and does not distinguish it from similar publish tools. It does cover the essential behavior and side effects, but for a tool with no annotations and no output schema, more context is needed to be fully complete.
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 compensate. It mentions 'section' which maps to section_id, but does not explain course_id or resource_ids at all. The optional resource_ids parameter could be used to restrict propagation, but the description says 'all modules' without addressing this ambiguity. The description adds minimal value over the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific action: 'Make a previewed section visible to students.' It specifies the resource (section) and the effect (visible to students), and adds propagation to all modules, which distinguishes it from broader publish tools. This is a strong verb+resource statement.
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 usage context is implied: this tool is used when you have a previewed section and want to make it visible. However, it does not explicitly state when to use this tool over sibling tools like publish_preview or release_section, and no alternatives or exclusions are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_calendar_eventA
Create a calendar event. Default eventtype=course. Set repeat_count>0 to create weekly recurrences. Returns the created event id and metadata.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| groupid | No | ||
| location | No | ||
| course_id | No | Attach the event to a course. Omit for user or site events. | |
| eventtype | No | course | |
| timestart | Yes | Unix timestamp for the event start. | |
| description | No | ||
| repeat_count | No | If >0, Moodle creates this many repeated events at 7-day intervals starting from timestart. | |
| timeduration | No | Seconds. 0 = no duration. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It discloses the default eventtype, the recurrence behavior when repeat_count > 0, and the return value (event id and metadata). However, it does not mention potential side effects, prerequisites, or error conditions, leaving some behavioral aspects opaque.
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 description is concise and front-loaded with the purpose. Every sentence provides useful information: the action, the default, the recurrence option, and the return value. There is no wasted wording.
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 tool with 9 parameters and no output schema, the description gives essential behavior and return information but omits details about parameter interactions, prerequisites, and potential failure modes. It is adequate but leaves gaps that the schema cannot fully fill.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema description coverage is only 44%, leaving many parameters (name, groupid, location, description, eventtype) without explanations. The description adds little beyond what the schema already states: it repeats the default for eventtype and the recurrence semantics for repeat_count, without clarifying the other parameters.
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 clearly identifies the action ('Create') and the resource ('calendar event'), distinguishing it from sibling tools like update_event and delete_event. It also provides key defaults and recurrence behavior, making the tool's purpose 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 description establishes clear context that this tool is for creating events, and the mention of default eventtype and recurrence helps guide when to use it. However, it does not explicitly name alternative tools for other operations, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_courseA
Create a new Moodle course with a stable idnumber. Throws MOODLE_WS_COURSE_EXISTS if the idnumber is already in use. Default: hidden (visible=false), topics format, 10 sections.
| Name | Required | Description | Default |
|---|---|---|---|
| lang | No | Course language code (e.g. "en", "pt", "pt_br"). The corresponding language pack MUST be installed on the Moodle server (Site administration > Language > Language packs), otherwise Moodle rejects the course creation. | |
| format | No | topics | |
| summary | No | ||
| visible | No | ||
| fullname | Yes | ||
| shortname | Yes | ||
| categoryid | No | ||
| numsections | No | ||
| idnumber_slug | Yes | Stable slug used to build the course idnumber (e.g. "ai-fundamentals-2026") |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden. It discloses the MOODLE_WS_COURSE_EXISTS error for duplicate idnumbers and states default visibility, format, and section count. Most defaults already appear in the schema, and it omits other behavioral details like permissions or side effects.
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 concise sentences, front-loaded with the primary purpose, then error behavior and defaults. There is no filler; every sentence 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 9-parameter creation tool with no output schema and no annotations, the description is too thin. It omits return value, permission requirements, and guidance for required fields, making it insufficient for an agent to invoke confidently without further schema inspection.
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 only 22% (lang and idnumber_slug have descriptions). The description adds little beyond the schema: it mentions 'stable idnumber' and defaults but does not explain fullname, shortname, categoryid, summary, or numsections semantics, leaving a significant 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?
The description opens with 'Create a new Moodle course', using a specific verb and resource, and adds 'with a stable idnumber' to define scope. This clearly distinguishes it from sibling tools like update_course and duplicate_course.
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 phrase 'Create a new' clearly signals use for new course creation, and the idnumber uniqueness error implies create-vs-update context. However, it does not explicitly name alternatives like update_course or state when not to use the tool, so it misses a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_forumA
Create or update a forum (discussion, announcement, Q&A, etc.) in a course section. Idempotent by slug. Default: hidden forum of type "general". Requires the plugin companion.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| slug | Yes | Stable key used to build the forum idnumber | |
| intro | No | ||
| visible | No | ||
| course_id | Yes | ||
| forum_type | No | Forum type. Use "news" for announcement forums (auto-subscribed). | general |
| section_num | No | Section number (0 = General, 1..N = topics) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses key behaviors: 'Idempotent by slug' (upsert behavior), default hidden and general type, and the requirement of a plugin companion. While it does not detail update semantics (e.g., merge vs replace) or return values, it provides meaningful behavioral context beyond the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three concise sentences, each adding value: purpose, idempotency, defaults, and a dependency. It is front-loaded and free of fluff, making it easy for an agent to parse quickly.
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?
Despite the description's clarity, the tool has 7 parameters, no output schema, and no annotations, so it needs more completeness. It covers core behavior but omits important context such as how updates affect existing data, what the plugin companion is for, and how to choose between this tool and create_forum_announcement. These gaps make it merely adequate.
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 only 43%, meaning the description must compensate. It adds meaning for 'slug' via idempotency and clarifies defaults ('hidden forum of type general') which are already present in the schema. It does not explain the roles of course_id, name, intro, or visible beyond what is implicit, leaving significant parameter ambiguity.
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 clearly states 'Create or update a forum' with the resource being a forum in a course section, and it mentions idempotency by slug. However, it does not explicitly distinguish itself from the sibling tool 'create_forum_announcement', despite mentioning announcements as a forum type, 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?
The description provides clear context: it is for creating or updating forums in a course section, and idempotency by slug implies use when you have a stable slug. However, it lacks explicit when-not-to-use guidance or alternatives, especially given the existence of create_forum_announcement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_forum_announcementB
Post a new discussion in a course forum. If forum_id is omitted, uses the course Announcements (type=news) forum.
| Name | Required | Description | Default |
|---|---|---|---|
| pin | No | ||
| format | No | html | |
| message | Yes | ||
| subject | Yes | ||
| forum_id | No | Specific forum id. If omitted, uses the course "Announcements" (news) forum, or the first forum in the course. | |
| course_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses only the default forum behavior when forum_id is omitted, but this is already captured in the schema's forum_id description. It omits the schema's additional fallback to the first forum, and it does not mention permissions, side effects, return values, or any other behavioral traits. With no annotations, the description carries the full burden and falls short.
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 description is extremely concise, using two short sentences to convey the core action and a key default. It is front-loaded with the primary purpose and contains no irrelevant 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?
Given that this is a create operation with six parameters, no annotations, and no output schema, the description is incomplete. It does not explain the required fields (subject, message, course_id), any permission prerequisites, or what the tool returns upon success. It only partially covers the forum_id behavior, leaving significant context gaps for an AI agent.
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 description adds little meaning beyond the schema. It does not explain the purpose of subject, message, pin, or format, and the only parameter it touches (forum_id) restates (and slightly understates) the schema's own description. With schema coverage at only 17%, the description fails to compensate for the missing parameter documentation.
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 clearly states the action ('Post a new discussion') and the resource ('course forum'), making it immediately distinct from sibling tools like create_forum (which creates a new forum) and send_moodle_message (which sends a message). The specific verb and object leave no ambiguity about what this tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides a practical hint about the default forum when forum_id is omitted, which implies a common use case (posting to Announcements). However, it does not explicitly state when to use this tool over alternatives like create_forum, send_moodle_message, or other communication tools, nor are there exclusion criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_groupA
Create a group inside a course. Use assign_to_group to populate it after.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| idnumber | No | Optional stable idnumber. Empty = auto-generated by Moodle. | |
| course_id | Yes | ||
| description | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description must carry the full burden of behavioral disclosure. It only states the core action and one follow-up step, but omits details about side effects, permissions, response shape, or nuances like idnumber auto-generation or idempotency. This is a significant gap for a mutation 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?
The description is extremely compact and front-loaded: a single sentence with clear subject and action, plus a brief directional pointer. Every word earns its place, and there is no redundant 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?
Given the lack of annotations and output schema, plus four parameters, the description is too thin. It does not convey prerequisites, return values, error conditions, or the lifecycle of the created group beyond the hint to assign members later. This leaves the agent with insufficient context 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 description coverage is only 25% (one property documented), and the description does not compensate. It does not explain the meaning of course_id, name, idnumber, or description beyond what is minimally implied by 'group'. The lone hint to 'populate it after' is about workflow, not parameter semantics.
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 clearly states the action ('Create') and the target resource ('a group inside a course'), which is specific and distinguishes it from sibling tools like assign_to_group, create_section, or create_course. The phrase 'inside a course' adds necessary scoping.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit context by directing the agent to use assign_to_group afterwards to populate the group, which clarifies the intended workflow and distinguishes this tool from its sibling. However, it does not mention when not to use this tool or alternative approaches beyond the one next step.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_sectionA
Create a new section in a course with a given name, summary, position and initial visibility. Idempotent by name: reusing an existing section name returns that section instead of creating a duplicate.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| summary | No | ||
| visible | No | ||
| position | No | Position in the course section list; 0 appends at the end. | |
| course_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden for behavioral disclosure. It usefully discloses idempotency by name, but does not mention what happens on success (return value), permission requirements, or error conditions. This leaves notable gaps beyond the idempotency note.
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 clear, front-loaded sentences with no redundancy. The action verb and resource are stated immediately, and the idempotency note is a bonus without bloat.
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 create operation with 5 parameters and no output schema or annotations, the description is adequate but incomplete. It explains creation and idempotency, but does not specify return values, failure modes, or permission requirements. Given the tool's moderate complexity, more context would be helpful.
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 only 20% (only position has a description). The description lists the key parameters (name, summary, position, visibility) and clarifies name behavior via idempotency, but course_id and defaults are left to the schema. It adds some meaning but does not fully compensate for the low coverage.
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?
Clearly states 'Create a new section in a course' and lists the specific attributes (name, summary, position, visibility), making the tool's function unambiguous. The idempotency note further distinguishes it from sibling tools like update_section or duplicate_section.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description makes it clear this is for creating new sections, which implies when to use it. It provides a key usage nuance (reusing a name returns existing section), but does not explicitly mention alternatives or exclusions. This is clear context without explicit when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_eventA
Delete one or more calendar events. Set delete_repeats=true to remove repeat instances as well.
| Name | Required | Description | Default |
|---|---|---|---|
| event_ids | Yes | ||
| delete_repeats | No | If true, deletes all repeat instances of the event(s) too. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It discloses the delete_repeats option, which clarifies default behavior, but it does not mention whether deletion is permanent, if special permissions are required, or what happens to related attendee data. This is a significant gap for a destructive operation.
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 concise sentences with a front-loaded purpose statement and a clear instruction. No unnecessary words, making it easy to parse quickly.
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 2-parameter tool with no output schema or annotations, the description covers the core function and the key option. However, it lacks important context such as permanence of deletion, permission requirements, or behavior for events that have already occurred, leaving some gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema only describes delete_repeats, not event_ids. The description adds value by clarifying that event_ids refer to calendar events, partially compensating for the gap. However, it does not add semantics beyond what the schema already provides for delete_repeats, so the contribution is moderate.
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 clearly states the verb 'Delete' and resource 'calendar events', distinguishing it from sibling tools like update_event or create_calendar_event. It also specifies that multiple events can be deleted at once and mentions the delete_repeats option, making the scope explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context for when to use this tool: whenever you need to delete calendar events. It also gives a specific instruction for handling repeat instances (set delete_repeats=true), but does not explicitly reference alternative tools or exclusions. This is clear context without exclusions, aligning with the 4-level.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_resourceA
Delete a Moodle course module by idnumber. By default only deletes MCP-managed idnumbers (mcp: prefix). Use force=true to delete any idnumber. Returns noop if the module does not exist.
| Name | Required | Description | Default |
|---|---|---|---|
| force | No | If true, bypass the mcp: prefix safety check and delete any idnumber. | |
| idnumber | Yes | idnumber of the Moodle module to delete. Use get_course_context to find idnumbers of MCP-managed resources (prefixed with mcp:). | |
| course_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses the default mcp: prefix safety check, the force bypass, and the noop return for non-existent modules. These are key behavioral traits that go beyond the schema and help the agent predict outcomes. It does not mention permanence or permissions, but the safety guard is well conveyed.
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 description is two concise sentences that front-load the purpose and then provide key details. Every word earns its place, with no redundancy or 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?
Given the tool's simplicity (3 params, no output schema), the description is complete enough. It explains the core action, the safety default, the force option, and the noop edge case. It could mention permissions or what 'course module' entails, but for the complexity level, it suffices.
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 67%, so the description adds some meaning beyond the schema. It reinforces the idnumber semantics by tying it to the mcp: prefix and get_course_context, and explains the force parameter's effect. course_id remains undocumented in both schema and description, but it is a standard identifier. Overall, the description compensates well for most gaps.
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 clearly states the action: 'Delete a Moodle course module by idnumber.' This is a specific verb+resource+identifier construction that distinguishes it from sibling tools like delete_event. The additional detail about MCP-managed idnumbers further clarifies its scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context on when to use the tool, noting the default safety behavior and when to use force=true. It does not explicitly mention alternatives, but it references get_course_context for finding idnumbers, giving practical guidance. No exclusions are given, but the context is clear enough for a simple delete tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
duplicate_courseA
Clone a course into a new one (backup+restore under the hood). Defaults copy activities/blocks/filters, NOT users/enrolments/grades. New course is hidden by default.
| Name | Required | Description | Default |
|---|---|---|---|
| options | No | ||
| visible | No | ||
| categoryid | No | ||
| new_fullname | Yes | ||
| new_shortname | Yes | ||
| source_course_id | Yes | ||
| new_idnumber_slug | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It adds value by revealing that cloning uses backup+restore internally and that the new course is hidden by default. However, it does not mention permissions, whether the source course is affected, or if the operation is asynchronous, so it is not fully comprehensive.
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 description is three concise sentences that immediately state the main purpose, then provide meaningful default behavior details. There is no redundant or filler content, and the structure front-loads the most important 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?
The tool is moderately complex with a nested options object and seven parameters, but the description only covers core behavior and defaults. It omits how to customize options (e.g., including users), expected return values, and any prerequisites. With no output schema or annotations, this is a notable gap, though the schema and defaults partially compensate.
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 description does not address any parameters directly, and the schema description coverage is 0%, meaning the description fails to compensate for the lack of explanation. Although the schema itself has rich property descriptions, the tool description adds no parameter semantics, which is a significant gap for a tool with 7 parameters.
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 starts with 'Clone a course into a new one' which is a specific verb+resource that clearly distinguishes this tool from siblings like create_course or duplicate_section. It also adds context about implementation (backup+restore) and default behavior, leaving no ambiguity about its function.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides useful context about what is copied by default (activities/blocks/filters) and what is not (users/enrolments/grades), helping the agent understand the tool's typical use. It does not explicitly name alternatives or state when not to use it, but the context is clear enough to guide selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
duplicate_sectionA
Duplicate all modules from a source section into a new section in the same course. New section is named per the name param. Idempotent: returns "exists" if a section with that name already exists.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Name for the new section. | |
| visible | No | ||
| course_id | Yes | ||
| source_section_id | Yes | ID of the section to duplicate (use get_course_context to find section IDs). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden for behavioral disclosure. It adds valuable context beyond the schema by noting the operation is idempotent and returns 'exists' when the section name already exists. However, it does not disclose other important traits such as whether the operation is destructive to existing data, what happens on invalid input, or what return value is expected on success.
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 description is two sentences and immediately states the primary action and key exception. It is front-loaded with the verb and resource, and every sentence carries meaningful information without unnecessary detail.
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?
As a mutation tool with no output schema, the description should clarify what the caller receives on success and how the input parameters affect behavior. It mentions the 'exists' idempotent case but not the success return value (e.g., new section ID) or the effect of the 'visible' parameter. This leaves important gaps for an agent to invoke the tool correctly and interpret results.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 50%, so the description should compensate for undocumented properties like course_id and visible. It does not: it only restates that the new section name comes from the 'name' parameter, which the schema already says. The phrase 'use get_course_context to find section IDs' is already in the schema and adds no new meaning. The description fails to clarify the remaining half of the parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses the specific verb 'duplicate' and clearly identifies the resource: 'all modules from a source section into a new section in the same course.' This distinguishes it from siblings like create_section or duplicate_course, and the scope (same course) is explicitly 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?
The description provides clear context for when to use the tool: to duplicate all modules from a source section into a new section. It doesn't explicitly list alternatives or exclusions, but the purpose is unambiguous enough for an agent to select it over other section-related tools. The parameter description for source_section_id adds helpful prerequisite guidance by pointing to get_course_context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
enrol_csvA
Batch-enrol users in a course from a CSV (email,firstname,lastname[,role]). Creates missing users by default with a random temp password. Returns per-row status.
| Name | Required | Description | Default |
|---|---|---|---|
| course_id | Yes | ||
| csv_content | Yes | CSV with headers email,firstname,lastname[,role]. role defaults to student. | |
| default_role_shortname | No | student | |
| create_users_if_missing | No | If true, unknown emails trigger a user creation with a random temp password. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must carry the behavioral burden. It discloses two key traits: 'Creates missing users by default with a random temp password' and 'Returns per-row status'. This covers the main side effect and result format. However, it does not mention permission requirements, whether existing users' roles are updated, or how errors in the CSV are handled. It provides moderate transparency but not full disclosure for a mutation operation.
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 description is exactly two sentences, front-loaded with the primary action and input format, followed by key behavioral notes. Every sentence adds essential information without redundant wording. It is concise and well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (4 parameters, no output schema, no annotations), the description covers the essential aspects: CSV format, user-creation behavior, and per-row status. It does not explain the detailed content of the status return or any permission/prerequisite requirements, but it provides enough for an agent to understand the tool's core purpose and side effects. It is reasonably complete for a batch operation.
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 50%: csv_content and create_users_if_missing have descriptions, while course_id and default_role_shortname do not. The description adds the CSV column layout and optional role, which supplements csv_content. It also confirms the default user-creation behavior. However, it does not explain course_id semantics or how default_role_shortname interacts with the optional role column in the CSV, leaving some parameters under-described.
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 clearly states the tool's function: 'Batch-enrol users in a course from a CSV'. It specifies the resource (course users), the action (enrol), and the input format (CSV with email, firstname, lastname, and optional role). This distinguishes it from sibling tools like unenrol_student or list_students, making its purpose 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 description provides clear context that this tool is for batch enrollment via CSV, implying it should be used when multiple users need to be enrolled at once. However, it does not explicitly name alternatives or provide when-not-to-use guidance, such as pointing to change_role for individual role changes. The usage context is clear, but exclusions are not stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
generate_videoA
Generate a short Italian-language video with Google Veo 3.1 and embed it in a new mod_page in Moodle. Requires GEMINI_API_KEY env. Returns { cmid, video_url, page_url }. Takes ~1 minute end-to-end for a lite 8s clip.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Visible module name shown to students | |
| model | No | Veo model. "lite" is cheapest (~$0.15/clip), default. | veo-3.1-lite-generate-preview |
| prompt | Yes | Italian-language video prompt (what Veo will render). Include scene, characters, mood, lighting, camera style. Native audio | |
| courseid | Yes | Moodle course ID | |
| idnumber | Yes | Stable idnumber for idempotency (e.g. "ita-a1-u3-video-mercato") | |
| intro_text | No | Optional Italian intro shown above the video (1-2 sentences) | |
| resolution | No | 1080p only allowed with duration=8 | 720p |
| sectionnum | Yes | Section number (0 = General, 1..N for Units) | |
| aspect_ratio | No | 16:9 | |
| duration_seconds | No | Clip duration — Veo 3.1 lite supports 4, 6, 8s | |
| comprehension_questions | No | Optional list of 2-4 Italian questions shown below the video |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must disclose behavioral traits itself. It mentions the required environment variable, the return shape ({ cmid, video_url, page_url }), and the asynchronous-ish wait time (~1 minute). It also implies a write operation by 'embed it in a new mod_page'. It could add side effects like cost or idempotency (which schema hints at), but the provided context is above average for a mutation 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?
The description is two sentences, front-loaded with the primary action, and every clause adds value: the resource (mod_page), the model (Veo 3.1), the language requirement, the dependency (API key), the return value, and the time estimate. No filler or repetition of schema content.
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 complex 11-parameter tool with no output schema, the description provides essential operational context: return format (not in schema), time-to-completion, and prerequisite. It could mention deletion or failure modes, but given the high schema coverage and the concise description, it is sufficiently complete for an agent to select and invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 91%, so the description doesn't need to explain parameters. The description adds no extra parameter details beyond what the schema already provides (e.g., prompt must be Italian, idnumber for idempotency). Baseline 3 is appropriate because the schema handles parameter semantics, and the description doesn't need to compensate.
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 opens with a specific verb+resource ('Generate a short Italian-language video with Google Veo 3.1 and embed it in a new mod_page in Moodle'), clearly distinguishing it from the sibling tools, which are course management, quiz, and messaging tools. It unambiguously states what the tool does and its primary side effect (creating a mod_page).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context for when to use the tool: for Italian-language short videos, with a stated prerequisite (GEMINI_API_KEY) and performance expectation (~1 minute). It does not explicitly name alternative tools or exclusion scenarios, but no sibling tool serves the same purpose, so the context is sufficient. A slight deduction for lacking explicit 'when not to use' guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_assign_submissionsA
Submissions for an assignment (default: only submitted state). Optionally fetch per-user grading status.
| Name | Required | Description | Default |
|---|---|---|---|
| status | No | submitted | |
| user_ids | No | If set with include_status_per_user, only fetches status for these users. | |
| assign_id | Yes | assign.instance id (NOT cmid). | |
| include_status_per_user | No | If true, fetches submission status (grading state, due/late flags) per user — heavier. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses the default status filter and the optional per-user grading status, which adds useful context. However, it does not describe the return format, whether it modifies data (though 'get' implies read-only), or any access requirements. This leaves gaps for the agent.
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 description is a single, front-loaded sentence that conveys the core purpose and a key option. It contains no redundant information and is appropriately concise.
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 tool with 4 parameters, no output schema, and no annotations, this description is minimally sufficient. It covers the main behavioral options but omits details about the response structure and the relationship between user_ids and include_status_per_user (though the schema covers that). The absence of output schema raises the need for more description, which is not fully met.
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 75% (3 of 4 parameters have descriptions). The description adds the default 'submitted' and the notion of per-user grading status, which aligns with include_status_per_user. It does not significantly extend beyond the schema, which already documents assign_id, user_ids, and include_status_per_user.
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 clearly states it retrieves submissions for an assignment, with a default status filter of 'submitted'. The name 'get_assign_submissions' reinforces this. The optional per-user grading status is also mentioned, adding scope without ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for fetching assignment submissions but does not explicitly state when to use this tool versus alternatives. No alternatives or exclusions are mentioned. The context of sibling tools (e.g., get_grades, get_completion) makes the purpose clear, but the guidance is implicit rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_completionB
Activity completion status for a user in a course: per cmid, the state (incomplete / complete / complete_pass / complete_fail) plus completion timestamp.
| Name | Required | Description | Default |
|---|---|---|---|
| user_id | Yes | ||
| course_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations present, the description carries the burden of behavioral disclosure. It usefully enumerates the possible state values and mentions the completion timestamp, but it does not explicitly state that this is a read-only operation, nor does it cover permissions, pagination, or error behavior.
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 description is a single compact sentence with no wasted words. It is concise, but it is a grammatical fragment lacking a verb and omits the connection between 'per cmid' and the input parameters, making it under-specified despite its brevity.
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 getter, the description adequately covers the return content—per-cmid state and timestamp—especially given the absence of an output schema. However, it does not explain what cmid refers to, whether the result is a list or single object, or how the two required parameters influence the result. It is adequate but leaves several contextual gaps.
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 should compensate by explaining course_id and user_id. It only paraphrases them conceptually and introduces 'cmid' as an output grouping without clarifying that cmid is not an input parameter. No additional meaning is added beyond the parameter names.
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 identifies a specific resource—activity completion status for a user in a course—and distinguishes it from sibling tools like get_grades by listing per-cmid state values and timestamp. However, it lacks an explicit action verb such as 'Gets' or 'Returns,' reading more as a noun phrase than a full tool statement.
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 is provided on when to use this tool versus alternatives like get_grades or get_course_logs. It does not mention typical use cases, prerequisites, or situations where another tool would be more appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_course_contextA
Returns a compact radiograph of a Moodle course: metadata, sections with module counts, recent MCP-published lessons, and enrolment counts (teachers vs students). Call this before publishing a lesson so the agent knows where it fits.
| Name | Required | Description | Default |
|---|---|---|---|
| course_id | Yes | ||
| include_recent_lessons | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses the content of the returned 'radiograph' and implies a read-only operation, but it does not mention potential side effects, limitations, or failure modes. It gives useful output detail but not exhaustive behavioral disclosure.
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 description is a single dense sentence enumerating return components, followed by a clear usage directive. Every word adds value, and the structure is well front-loaded with the primary purpose.
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 2-param tool with no output schema, the description covers the main return categories (metadata, sections, lessons, enrolments) and the invocation context. It lacks parameter explanations, but the core purpose and contents are sufficiently described for an agent to call it effectively.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has 2 parameters but the description provides 0% coverage. It does not explain course_id or include_recent_lessons; the phrase 'recent MCP-published lessons' hints at the latter but no explicit mapping is made. The agent must infer parameter meanings from the output description, which is insufficient.
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?
Description uses a specific verb 'Returns' and a unique resource label 'compact radiograph of a Moodle course', enumerating concrete components (metadata, sections with module counts, recent MCP-published lessons, enrolment counts). This clearly distinguishes it from sibling tools like publish_class_lesson or get_course_logs.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly instructs when to use it: 'Call this before publishing a lesson so the agent knows where it fits.' This provides clear context, though it does not mention exclusions or alternative tools for similar context needs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_course_logsA
Approximate activity log for a course: per-user firstaccess/lastaccess derived from core_enrol_get_enrolled_users. Flags users active within the last N hours (default 24). Moodle core does not expose a generic activity-log WS.
| Name | Required | Description | Default |
|---|---|---|---|
| course_id | Yes | ||
| hours_since | No | Window (in hours) to flag a user as "recent". Default 24h. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the transparency burden. It discloses that the log is approximate, derived from enrollment data, and flags users within a time window. It does not explicitly state read-only behavior, but the nature of the tool implies it. The limitations are well communicated.
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 description is two sentences with no fluff. It front-loads the core purpose and efficiently covers the key behavioral detail (flagging window) and context (no generic WS). 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?
The tool is simple with 2 parameters and no output schema. The description explains the purpose, the approximate nature, the derivation source, and the time-window behavior. It hints at return values (per-user firstaccess/lastaccess) without detailing them, which is acceptable given no output schema. A small gap is not specifying the response format or error handling.
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 50%: hours_since has a description, course_id does not. The description reinforces the meaning of hours_since by explaining the 'last N hours' flagging, but adds little for course_id beyond its obvious role. It partially compensates for the missing course_id description but does not fully advance beyond schema details.
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 clearly states the tool's purpose: providing an approximate activity log for a course with per-user firstaccess/lastaccess data. It specifies the derivation source (core_enrol_get_enrolled_users) and the flagging behavior, distinguishing it from siblings like get_grades or get_completion.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage context by noting that Moodle core does not expose a generic activity-log WS, suggesting this is the workaround. However, it does not explicitly state when to use this tool over alternatives or provide exclusion criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_gradesA
Get gradebook entries for a user in a course (or for every enrolled user if user_id is omitted). Returns raw/max grade, item name, module type, feedback.
| Name | Required | Description | Default |
|---|---|---|---|
| user_id | No | If omitted, returns grades for all enrolled users in the course. | |
| course_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description bears the transparency burden. It discloses the return payload (raw/max grade, item name, module type, feedback) and the behavior when user_id is omitted (returns for all enrolled users). It does not mention errors, permissions, or side effects, but the 'Get' verb and return-focused wording imply a non-mutating operation.
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 description is a single, compact sentence that front-loads the action and scope, then lists the return fields. Every word adds value; no filler or repetition.
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?
The tool has no output schema, but the description compensates by specifying the returned fields. The optional user_id behavior is clearly explained. It omits potential error conditions or prerequisite permissions, but for a simple read operation with only two parameters, the description provides adequate context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already describes the user_id parameter's optional behavior (50% coverage). The description adds no new parameter-specific information beyond repeating that user_id is optional and indicating course context. The course_id parameter remains undocumented in the schema and description, though its meaning is easily inferred from the tool's purpose.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Get') and resource ('gradebook entries'), clearly stating the optional scope (a single user or all enrolled users if user_id is omitted). It also lists the returned data (raw/max grade, item name, module type, feedback), which distinguishes it from siblings like get_quiz_attempts or get_completion.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context (when to retrieve grades, optionally for all users), but it does not explicitly contrast with alternative tools or mention situations where this tool should not be used. The guidance is implicit rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_quiz_attemptsA
Quiz attempts for a user on a given quiz. Default: only finished attempts. Set include_review=true to also fetch per-question details (heavier).
| Name | Required | Description | Default |
|---|---|---|---|
| status | No | finished | |
| quiz_id | Yes | ||
| user_id | Yes | ||
| include_review | No | If true, fetches per-attempt review detail (heavier — use sparingly). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the transparency burden but largely mirrors schema details: the default status is already in the schema, and include_review's heavier nature is also described in the schema. It adds minimal new context beyond confirming read-only behavior via the tool name.
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 description is two short sentences that front-load the core purpose and essential usage note, with no wasted 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?
The description covers the main purpose, default behavior, and a critical performance caveat, which is sufficient for a retrieval tool. It omits details like status enum values and return format, but these are available in the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has only 25% coverage (include_review). The description compensates by clarifying that quiz_id and user_id target a specific user on a quiz, and it explains the status default and include_review behavior, making the tool usable without reading the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the resource (quiz attempts), the scope (a user on a given quiz), and implies the 'get' action via the tool name. It distinguishes from siblings like get_quiz_questions (questions) and get_grades (grades) by focusing specifically on attempts.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explains the default behavior (finished attempts) and when to use include_review for per-question details, noting the heavier cost. However, it does not explicitly reference alternative tools or mention when not to use this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_quiz_questionsA
List all questions attached to a quiz (identified by its slug). Read-only. Returns question id, name, type, and slot number for each question.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | Slug that identifies the quiz (same used in configure_quiz / publish_exam_lesson). | |
| course_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the behavioral disclosure burden. It explicitly states 'Read-only' and discloses the return shape (question id, name, type, slot number), which is meaningful behavioral context. It doesn't cover error cases or pagination, but for a simple list operation this is adequate.
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 description is two concise sentences, front-loaded with the primary action, and contains no filler. Every word adds value: it names the resource, the identification mechanism, the read-only nature, and the return fields.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the low complexity of a list operation, no output schema, and no annotations, the description is nearly complete: it states the purpose, the key identifier, and the returned fields. It could mention the role of course_id or behavior when the quiz doesn't exist, but these are minor gaps.
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 50%, with only the slug parameter described. The description reinforces slug's role as the quiz identifier, but it adds no meaning for course_id, leaving the agent to infer its purpose. This is acceptable because course_id is likely obvious from course context, but not fully compensated.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('List') and a clear resource ('all questions attached to a quiz'), and immediately distinguishes this from sibling tools like modify_question and import_gift by focusing on retrieval. The phrase 'identified by its slug' further pins down the exact scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly frames when to use the tool: when you need a read-only list of a quiz's questions. It doesn't explicitly name alternatives or state when not to use it, but the read-only declaration and contrast with mutation/modification siblings imply the appropriate context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_site_infoA
Get site + user + token info (core_webservice_get_site_info). Use include_functions=true at bootstrap to verify which plugin WS functions are exposed to the token.
| Name | Required | Description | Default |
|---|---|---|---|
| functions_filter | No | Substring to filter the functions list (only applies if include_functions=true). | |
| include_functions | No | If true, return the full list of WS functions available to the token (can be large — usually 700+). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the transparency burden. It discloses that including functions can return a large list (though the schema already says this) and positions the call as a bootstrap verification step. However, it does not explicitly state that it's a read-only safe operation or describe the response structure beyond 'site + user + token info', leaving some behavioral expectations unspecified.
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 description is two sentences, front-loaded with the main purpose, and includes a specific, useful tip. No filler or repetition of schema content. It earns its place efficiently.
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 diagnostic tool with two optional parameters and no output schema, the description conveys the core purpose and a key use case. It could be more complete by summarizing what 'site + user + token info' includes or warning about the large response size (though the schema does warn), but it's largely sufficient for an agent to invoke correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the parameters are well-documented. The description reinforces the use of include_functions=true in a bootstrap context, adding a practical semantics beyond the schema's technical description. However, it does not add new information about functions_filter. Thus it stays at the baseline of 3.
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 clearly states the tool retrieves site, user, and token info, and names the underlying web service function. It distinguishes itself from sibling tools by emphasizing token and function list verification, making its purpose specific and 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?
It provides a concrete usage scenario: 'Use include_functions=true at bootstrap to verify which plugin WS functions are exposed to the token.' This implies when the tool is useful but does not explicitly mention alternatives or when not to use it. There is clear context, just no exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
grade_manuallyA
Manually grade an assignment submission (mod_assign_save_grade). Feedback text is HTML-safe. Supports team grading and marking workflow state.
| Name | Required | Description | Default |
|---|---|---|---|
| grade | Yes | Numeric grade. -1 means "no grade yet". Negative values other than -1 are invalid in most scales. | |
| user_id | Yes | ||
| assign_id | Yes | ||
| feedback_text | No | ||
| attempt_number | No | -1 = grade the latest attempt. Otherwise specify the attempt number. | |
| workflow_state | No | Marking workflow state (only applies when the assignment has workflow enabled). | |
| apply_to_all_members | No | If the assignment uses team submission, apply this grade to every member of the team. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full disclosure burden. It does mention useful behaviors (HTML-safe feedback, team grading support, workflow state) but fails to state that this saves/overwrites an existing grade, whether the change is reversible, or what the response looks like. For a mutation tool, this is a significant transparency gap.
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 description is three short sentences, front-loaded with the core purpose, and every sentence adds information (operation, HTML-safety, team/workflow features). No redundant or filler content.
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?
The tool has 7 parameters, no annotations, and no output schema. The description covers some advanced features (team grading, workflow) but omits critical context such as return values, error behavior, permission prerequisites, and the fact that existing grades will be overwritten. Given the tool's complexity, the description is minimally adequate but incomplete.
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 descriptions cover 57% of parameters. The description adds modest meaning by noting feedback text is HTML-safe and mentions team/workflow capabilities, but it does not clarify the three undocumented parameters (assign_id, user_id, feedback_text) beyond what their names suggest. The added context is helpful but not comprehensive enough to raise the score above baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Manually grade') and the resource ('an assignment submission'), and references the underlying Moodle function (mod_assign_save_grade) to remove ambiguity. There are no sibling tools that perform grading, so it is well-differentiated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the tool is for manual, human-mediated grading but does not explicitly state when to use it versus alternatives (e.g., bulk/automatic grading tools) or provide any exclusion criteria. No other grading tool appears among siblings, but the guidance is still implicit rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hide_sectionA
Hide a course section (and its modules) from students. Visibility propagates to all modules inside the section.
| Name | Required | Description | Default |
|---|---|---|---|
| course_id | Yes | ||
| section_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses an important behavioral trait: visibility propagates to all modules inside the section. With no annotations provided, the description carries the full burden, but it does not mention reversibility, permissions, or other side effects. This is a moderate level of transparency – useful but not comprehensive.
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 description is two concise sentences. The first sentence states the primary action and target, and the second sentence adds a key propagation detail. Every word earns its place, with no fluff or unnecessary repetition.
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 mutation tool with two parameters and no output schema, the description covers the core action and the important propagation behavior. It does not mention reversibility or response format, but these are not strictly necessary given the tool's simplicity and the absence of an output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema defines two parameters (course_id and section_id) with clear, self-descriptive names and integer types. However, schema_description_coverage is 0%, and the description does not explicitly explain or elaborate on these parameters. The parameter names are intuitive enough, so the lack of additional semantics is acceptable but not fully compensated.
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?
Description uses the specific verb 'Hide' with the resource 'course section' and audience 'from students', and clarifies that visibility propagates to all modules inside the section. This clearly distinguishes it from sibling tools like release_section, which makes the purpose 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 description implies the use case: use this tool when you want to hide a course section from students. However, it does not explicitly mention alternatives, such as using release_section to unhide, or any exclusions or prerequisites. Guidance is adequate but not explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
import_giftA
Import GIFT-formatted questions into a quiz. Creates the questions in a bank category and appends them to the quiz slots by default. Idempotent (plugin dedupes by question name within the category).
| Name | Required | Description | Default |
|---|---|---|---|
| append | No | If true, append to quiz slots. If false, only create in bank without attaching. | |
| course_id | Yes | ||
| gift_text | Yes | Full GIFT-format text block with one or more questions. | |
| quiz_slug | Yes | Slug that identifies the target quiz (same used in configure_quiz). | |
| category_name | No | Question bank category to drop the questions in. Defaults to the quiz name. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and discloses important traits: it creates questions in a bank category, appends to quiz slots by default, and is idempotent with deduplication by question name. This provides useful behavioral context beyond a simple import statement, though it does not specify whether existing questions are updated or skipped.
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 description is three sentences that front-load the primary purpose, then add the key behavioral details (default append and idempotency). Every sentence adds value with no wasted 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?
The description covers the core behavior and default option, and the schema fills in most parameter details. Missing are explicit return values or error behavior, but for an import tool with no output schema, the current information is likely sufficient 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 descriptions cover 4 of 5 parameters (80%), leaving only course_id without a description. The description mentions the bank category and quiz slots but does not add meaningful syntax or interplay details beyond what the schema already states for append and category_name.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb+resource ('Import GIFT-formatted questions into a quiz') and adds context about creating questions in a bank category and appending them to quiz slots. This clearly distinguishes it from sibling tools like modify_question or get_quiz_questions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the use case for importing GIFT text into a quiz but does not explicitly state when to use it over alternatives or provide exclusions. No contrast with tools like configure_quiz or modify_question is given, making the guidance implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_calendar_eventsB
List calendar events by courses/groups/categories, optionally filtered by a timestart/timeend range.
| Name | Required | Description | Default |
|---|---|---|---|
| timeend | No | ||
| group_ids | No | ||
| timestart | No | ||
| course_ids | No | ||
| category_ids | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It states the basic operation and optional filters, but does not disclose what events are returned (e.g., default behavior with no filters, pagination, return format), permissions required, or any other behavioral traits. This is a significant gap for a tool with no output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence that avoids redundancy. Every word contributes to explaining the purpose and key options, with no filler or repetition.
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?
The tool has five optional parameters and no output schema, yet the description only covers the core listing and filtering behavior. It omits return value details, pagination, default scope, and any usage prerequisites. For a tool with this complexity and no annotations, the description is underspecified.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has no parameter descriptions (0% coverage), so the description's mention of 'courses/groups/categories' and 'timestart/timeend range' adds meaning to all five parameters. It clarifies their purpose as filters, but does not explain how they combine or whether both timestart and timeend are needed together. These are reasonable basics but not comprehensive.
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 clearly states the verb 'List' and the resource 'calendar events', and specifies the filtering dimensions (courses/groups/categories, timestart/timeend). This distinguishes it from sibling tools like create_calendar_event, update_event, and delete_event.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use the tool (to list calendar events) but does not explicitly say when not to use it or compare to alternatives. It provides context about optional filters, which implies usage for retrieval, but no direct exclusions or alternatives are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_my_coursesA
List courses where a user is enrolled. Accepts userid (e.g. obtain from get_site_info for the bot, or pass a student_id-mapped Moodle userid).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| userid | Yes | Moodle user id whose courses to list. Use get_site_info / core_webservice_get_site_info to find the bot user id. | |
| only_visible | No | If true, filter out hidden (archived) courses. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must stand alone. It states what the tool does but does not disclose behaviors like whether hidden courses are included by default (only_visible defaults to false in the schema), pagination, or rate limits. The schema provides some parameter details, but the description itself is minimal and does not add behavioral context.
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 description is a single sentence with no wasted words. It front-loads the purpose and includes a useful parenthetical, making it both concise and well-structured.
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?
The description is sufficient for a simple listing tool, but it lacks details on return structure, pagination, and the meaning of limit. Since there is no output schema and annotations are absent, the description could be more informative to fully guide an agent.
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 description adds a note on userid sources ('obtain from get_site_info for the bot, or pass a student_id-mapped Moodle userid'), which supplements the schema's userid description. However, it does not explain the limit parameter at all, and only_visible is already described in the schema. With schema coverage at 67%, the description provides partial added value.
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 clearly states the tool's function: 'List courses where a user is enrolled.' The verb 'list' and resource 'courses' are specific, and the scope (for a given userid) distinguishes it from sibling tools like list_students or get_course_context.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context on when to use the tool by specifying it lists courses for a specific user, and provides a useful hint on obtaining the userid from get_site_info. It doesn't explicitly name alternatives or state when not to use it, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_studentsA
List enrolled users in a course. Filter by role shortname (default: student). Returns id, fullname, email, lastaccess, roles and groups per user.
| Name | Required | Description | Default |
|---|---|---|---|
| role | No | student | |
| limit | No | ||
| course_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the transparency burden. It reveals the output fields (id, fullname, email, lastaccess, roles, groups) and the default role (student), which helps the agent understand the operation's behavior. However, it does not explicitly state that this is a read-only operation or detail limit-related behavior, though those are partially covered by the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loaded with the core purpose, and contains no filler. Every sentence adds useful information: the action, the filter, and the return fields.
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 list tool with no output schema, the description covers return fields and default behavior, which is sufficient for basic usage. It does not mention pagination or maximum results, but the schema includes a limit parameter with default and maximum, leaving only minor gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has 0% description coverage, so the description must add meaning to parameters. It explains that 'role' is a role shortname and notes the default, adding semantic value beyond the enum. However, it does not mention the 'limit' parameter or elaborate on 'course_id', so the compensation is only partial.
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 clearly states the tool's function: 'List enrolled users in a course.' It specifies the primary resource (course users), the verb (list), and adds detail about filtering by role and return fields. This distinguishes it from sibling tools like list_my_courses or get_grades.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use it (when you need enrolled users in a course and optional role filtering), but it does not explicitly mention alternatives or exclusions. It lacks guidance on when to prefer other tools like enrol_csv or change_role, so the usage context is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_user_badgesA
List badges earned by a user. Optionally filtered by course_id. Read-only — awarding badges is deferred to v0.6.
| Name | Required | Description | Default |
|---|---|---|---|
| user_id | Yes | ||
| course_id | No | If set, only returns badges awarded in this course. Otherwise site-wide. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the transparency burden. It discloses read-only behavior and the deferral of awarding, but omits details about return format, error handling, visibility rules, or authentication requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences; first sentence states purpose and optional filtering, second conveys read-only constraint. No wasted 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?
For a simple two-parameter list operation, the description gives the essential purpose and a read-only caveat. It doesn't specify return structure, but 'List' implies an array of badge records; this is acceptable given the tool's low 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?
The schema documents course_id as an optional filter, and the description reinforces it, while user_id has no schema description but is clarified by 'earned by a user.' It doesn't fully compensate for the missing semantics of user_id (e.g., whether it is a Moodle user ID or requires a specific role).
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?
Description uses specific verb 'List' and clear resource 'badges earned by a user,' distinct from sibling tools like list_students or get_grades. Optional course_id filter further clarifies scope.
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?
States read-only and explicitly notes awarding badges is deferred to v0.6, which sets the expectation that this tool is for querying, not modifying. It doesn't name an alternative for awarding because none exists among siblings, but it clearly implies when not to use this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
modify_questionA
Edit an existing question (typo fix, reformulation, feedback tweak). Writes directly to DB, bypass Moodle 5.0.2 qbank form bug. Input: course_id, question_id, optional name / question_text / answers[]. Coverage: name, text, answers (answer/feedback/fraction).
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | New question name. Pass "" to skip. | |
| answers | No | Optional list of answer edits. Each item targets an answer by its 0-based index. Empty array = no answer edits. | |
| course_id | Yes | ||
| question_id | Yes | Moodle question.id (NOT question_bank_entries.id). Get it from import_gift output or question bank UI. | |
| question_text | No | New question text (HTML). Pass "" to skip. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the transparency burden. It discloses that the tool writes directly to the DB and bypasses a specific Moodle bug, which is valuable behavioral context. It also enumerates the editable fields. However, it does not mention permissions, reversibility, or return behavior, leaving some significant gaps.
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 description is concise and well-structured: it opens with the core purpose, follows with a key behavioral note, and then summarizes inputs. Every sentence adds value without unnecessary verbosity.
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 does not need to explain return values, but it could have mentioned likely return behavior. It covers purpose, usage context, behavioral trait (DB write, bug bypass), and parameter summary. For a focused edit tool, this is sufficient, though it omits permission requirements and side effects.
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 high (80%), so the baseline is 3. The description adds a high-level summary of inputs and coverage (name, text, answers) but largely repeats what the schema already documents. It clarifies that fields are optional and can be skipped, but that info is already present in the schema descriptions.
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 clearly states the tool's purpose: editing an existing question, with specific examples (typo fix, reformulation, feedback tweak). It uses a specific verb and resource, distinguishing it from other tools in the sibling list such as import_gift or configure_quiz.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context: for editing questions, and mentions bypassing a known Moodle form bug, which implies when this direct-DB approach is needed. However, it does not explicitly name alternatives or state when not to use this tool, so it stops short of a full 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
publish_class_lessonA
Publish a LessonPlan markdown file as a Moodle section with component modules. Idempotent: republishing the same lesson updates in place, never duplicates. Default mode is hidden. Use publish_preview + confirm_preview for the preview workflow.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | hidden | |
| course_id | Yes | ||
| section_id | No | ||
| lesson_path | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden. It discloses idempotency ('republishing the same lesson updates in place, never duplicates') and the default mode ('hidden'), which are valuable. However, it does not mention permissions, effects on existing section content, or what happens when section_id is omitted, leaving gaps.
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 description is two sentences, front-loaded with the core action, and each sentence adds distinct value (purpose, idempotency, default, and alternative workflow). No wasted 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?
Given the tool's complexity (publishing to Moodle with optional section_id) and lack of output schema, the description covers key aspects but omits return behavior, prerequisites, and distinction from publish_exam_lesson. It is adequate but not fully complete for a tool with no annotations or output schema.
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 compensate for parameter meaning. It only indirectly references lesson_path ('LessonPlan markdown file') and repeats the mode default already present in the schema. It does not explain course_id or section_id semantics or the distinction between optional and required fields.
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 action ('Publish a LessonPlan markdown file as a Moodle section with component modules'), clearly identifying the resource and result. It also differentiates from the preview workflow by naming publish_preview and confirm_preview, making the tool's purpose distinct among siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly directs users to the preview workflow ('Use publish_preview + confirm_preview for the preview workflow'), providing a clear alternative. It also notes the default mode is 'hidden', which is practical guidance for typical use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
publish_exam_lessonA
Create or update a quiz and populate it with GIFT questions in one call. Runs plugin repair+promote steps after import so the quiz is immediately attemptable. Idempotent by (course_id, slug).
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| slug | Yes | Stable slug for this quiz. Same slug → same quiz (idempotent). | |
| grade | No | ||
| intro | No | ||
| visible | No | ||
| attempts | No | ||
| course_id | Yes | ||
| gift_text | Yes | GIFT-formatted question block. Will be imported into the quiz. | |
| grademethod | No | highest | |
| section_num | No | ||
| category_name | No | ||
| repair_sections | No | After import, call repair_quiz_sections to ensure the quiz has a default quiz_sections row (fixes "noquestionsfound" attempts). | |
| promote_questions | No | After import, promote question_versions from draft to ready (makes them visible in attempts). | |
| timelimit_seconds | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses idempotency by (course_id, slug) and mentions that repair+promote steps are run, making the quiz immediately attemptable. These are meaningful behavioral facts beyond the schema, though details on return values or error handling are absent.
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 description is three sentences long, starts with the primary purpose, and includes no redundant or filler content. Every sentence earns its place, making it highly concise and well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity of 14 parameters, no output schema, and no annotations, the description is too brief. It covers the core action and key behaviors but leaves out return-value semantics, error handling, and the meaning of several parameters, making it incomplete for effective agent use.
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 only 29% (4 of 14 params have descriptions). The description mentions course_id and slug for idempotency and gift_text for questions, but it does not clarify many other parameters like grademethod, section_num, or timelimit_seconds. With such low coverage, the description insufficiently compensates.
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 clearly states a create-or-update operation for a quiz populated with GIFT questions, distinguishing it from sibling tools like import_gift or configure_quiz. The mention of 'in one call' additionally highlights its combined nature, making the purpose 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 description implies usage as a combined create/update + import operation, but it does not explicitly contrast with alternatives such as import_gift when a quiz already exists. There is no when-not guidance or mention of preferred scenarios, leaving some ambiguity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
publish_previewA
Publish a LessonPlan in hidden preview mode. Returns the same shape as publish_class_lesson plus preview_url the teacher can open to review. Students will not see anything until confirm_preview is called.
| Name | Required | Description | Default |
|---|---|---|---|
| course_id | Yes | ||
| lesson_path | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden. It discloses the hidden preview state, that students will not see anything until confirm_preview, and the return shape (same as publish_class_lesson plus preview_url). This provides meaningful behavioral context, though it omits details like permission requirements or whether the preview is overwritable.
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 core purpose. The second sentence adds essential behavior (hidden from students) and return shape. No wasted 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?
For a simple two-parameter tool, the description covers the key context: the preview workflow and what to expect in the response. It references publish_class_lesson for extended return details, which helps completeness, but lacks any error/side-effect information.
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 description does not explain what lesson_path or course_id represent or how they are used. The parameter names are somewhat self-explanatory, but the description adds no additional semantic value.
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 action: 'Publish a LessonPlan in hidden preview mode.' It clearly identifies the resource (LessonPlan) and the mode (hidden preview), and differentiates from siblings by referencing publish_class_lesson and confirm_preview.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the intended workflow: use this to create a preview, then call confirm_preview to make it visible. It references publish_class_lesson for shape comparison, but doesn't explicitly state when to prefer this over other publishing tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
release_sectionA
Make a course section visible to students (reverse of hide_section).
| Name | Required | Description | Default |
|---|---|---|---|
| course_id | Yes | ||
| section_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry the full burden. It states the primary effect but omits important behavioral details such as required permissions, idempotency (what happens if the section is already visible), reversibility (though implied by hide_section), or side effects on students or sub-sections. This is a significant gap for a mutation 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?
The description is a single concise sentence that immediately communicates the action and its relationship to hide_section. Every word contributes value, with no filler or redundant 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 a tool with no output schema or annotations, the description is quite sparse. It does not mention what the tool returns (e.g., success response), prerequisites (section must exist, user permissions), or edge cases (already visible, invalid IDs). Given the simplicity of the tool, more behavioral context is expected.
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 compensate. While the parameter names course_id and section_id are largely self-explanatory, the description adds minimal semantic meaning beyond what names provide. It implicitly links them via 'course section' but doesn't clarify valid values or relationships, so a baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb 'Make' and clearly identifies the resource 'course section visible to students'. It also explicitly names the reverse operation 'hide_section', which distinguishes it from the sibling tool and clarifies its role.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context by stating it is the reverse of hide_section, implying when to use it (when a section should be made visible). However, it does not explicitly enumerate when-not-to-use scenarios or alternatives beyond hide_section, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reorder_sectionsB
Reorder sections in a course. Accepts an array of {section_id, position} and applies the full deterministic layout in one batched call.
| Name | Required | Description | Default |
|---|---|---|---|
| order | Yes | Desired ordering as an array of {section_id, position}. Position is 0-indexed (0 = first after General). Sections not in the array keep their current position but may shift. | |
| course_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It discloses that the operation is batched and deterministic, but it does not mention potential side effects (e.g., unlisted sections shifting), permissions, or reversibility. The schema provides more detail but the description itself remains vague.
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 description is two sentences with no filler, front-loading the primary action. Every word serves a purpose, making it highly concise and well-structured.
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 mutation tool with no annotations and no output schema, the description is incomplete. It does not mention return values, error behavior, or the effect on sections not listed in the array (only hinted at in the schema). The tool's complexity is moderate, but the description underspecifies essential context.
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 50%, and the description does not compensate. It repeats the array structure but adds no meaning beyond the schema's existing order description. The course_id parameter is entirely unexplained, and the description omits details like 0-indexing or behavior for omitted sections (both present only in the schema).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the action (reorder) and the resource (sections in a course), distinguishing it from sibling section tools like create_section, update_section, or hide_section. The mention of a batched call reinforces its specific purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies it is for bulk reordering ('in one batched call') but does not explicitly state when to use this tool over alternatives, nor does it name any alternative. It gives no negative guidance or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reset_passwordA
Reset a user's password. If new_password is omitted, generates a random strong one and returns it (you MUST forward to the user out-of-band).
| Name | Required | Description | Default |
|---|---|---|---|
| user_id | Yes | ||
| new_password | No | If omitted, generates a random strong password and returns it in the payload. The user should be told to change it on first login. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the behavioral transparency burden. It discloses the key behavior of generating and returning a password when omitted, and emphasizes the out-of-band delivery requirement. However, it does not mention potential side effects like invalidating existing sessions or what happens on failure.
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 description is two sentences, front-loaded with the primary action, and contains no fluff. Every sentence adds critical information: the core purpose and the optional-password behavior with a security instruction.
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?
The description covers the main usage scenario and the special case of omitted new_password, but it lacks important context for a mutation tool, such as whether the reset takes immediate effect, side effects like logging out existing sessions, or behavior on invalid user IDs. This is partially mitigated by the schema's details on new_password.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema covers one of two parameters (new_password) with a detailed description, but user_id lacks any description. The tool description does not add meaning for user_id beyond the tool name's implication, and it merely repeats the new_password behavior already described in the schema. With only 50% schema coverage, the description should compensate but does not.
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 clearly states the tool resets a user's password, with a specific verb and resource. It also distinguishes behavior based on the optional new_password parameter, making the purpose 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 description gives clear context on when to use the tool (to reset a password) and includes an important guideline: if no new_password is provided, the generated password must be forwarded to the user out-of-band. It does not explicitly mention alternatives, but no sibling tool offers similar functionality.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
send_moodle_messageA
Send a private Moodle message to one or more user ids. Max 50 recipients per call. Uses core_message_send_instant_messages.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | ||
| format | No | plain | |
| recipients | Yes | Moodle user ids to message. Max 50 per call. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description mentions a recipient limit and the underlying Moodle function, but since there are no annotations, it carries full burden for behavioral disclosure. It does not explicitly note that this is a write operation with side effects, nor does it cover authentication, failure modes, or response format, leaving significant gaps.
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 description is a single concise sentence that front-loads the core action and includes a key constraint. It contains no fluff or redundant phrasing, making it highly efficient for an agent to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the small parameter set and lack of output schema, the description is somewhat complete but omits important context such as return values, error handling, and behavior with invalid user IDs. The absence of annotations increases the need for such details, which are not provided.
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 only 33%, and the description does not compensate for the lack of detail on 'text' and 'format'. The max-50 recipient limit is repeated from the schema without adding new meaning. The description adds no significant semantic value beyond what the parameter names and enum already convey.
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 clearly states a specific action ('Send a private Moodle message') and identifies the target ('one or more user ids'), which distinguishes it from sibling tools like create_forum_announcement. It also includes a concrete constraint ('Max 50 recipients per call'), making the tool's function 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 description implies usage for private messaging but does not explicitly state when to use this tool over alternatives, nor does it mention any exclusions. It lacks references to sibling tools or scenarios where a different communication method would be more appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
unenrol_studentB
Unenrol one or more users from a course. Non-destructive: user data is preserved, only the course enrolment link is removed.
| Name | Required | Description | Default |
|---|---|---|---|
| user_ids | Yes | ||
| course_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It adds valuable context by stating 'Non-destructive: user data is preserved, only the course enrolment link is removed', which goes beyond the schema. However, it omits details about permissions, return values, and edge cases like unenrolling non-enrolled users.
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 description is a single sentence that is front-loaded with the core action. Every clause earns its place, with no redundant or vague wording.
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?
The description is adequate for a simple two-parameter tool, covering purpose and safety. However, it lacks parameter-level detail and usage alternatives, leaving some ambiguity for an agent selecting or invoking the 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 compensate. It only maps 'one or more users' and 'course' to user_ids and course_id, but does not explain the semantics of the IDs, accepted formats, or behavior when parameters are invalid.
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 clearly states the verb 'Unenrol' and the resource 'one or more users from a course', making the tool's purpose unambiguous. This also distinguishes it from sibling tools like enrol_csv and change_role.
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 explicit guidance on when to use this tool versus alternatives, such as enrol_csv for enrolling users. The description only states the operation and non-destructive nature, but does not provide exclusions or context for selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_courseB
Update one or more fields of a course (fullname / shortname / summary / visible / lang / categoryid). At least one field is required.
| Name | Required | Description | Default |
|---|---|---|---|
| lang | No | ||
| summary | No | ||
| visible | No | ||
| fullname | No | ||
| course_id | Yes | ||
| shortname | No | ||
| categoryid | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description bears full responsibility for behavioral disclosure. It only says 'Update' and notes a required-field constraint; it does not mention permissions, reversibility, side effects, or what happens if no fields are provided. This is insufficient for a mutation 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?
The description is a single concise sentence with no filler. The action verb and resource are front-loaded, and the field list is compact.
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 annotations and no output schema, the description must provide comprehensive context. It fails to clarify update semantics, return values, error behavior, prerequisites, or authorization requirements. The enumerated fields and one constraint are not enough for a 7-parameter mutation 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 compensate. It lists field names already present in the schema, adding only the 'at least one field required' constraint. It does not explain valid values for lang, visible, or categoryid, nor the role of course_id beyond being required.
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 clearly states the tool updates a course and enumerates the specific updatable fields (fullname, shortname, summary, visible, lang, categoryid). This distinguishes it from sibling tools like update_section or create_course.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies this tool is for modifying existing course fields, but it does not explicitly state when to use it over alternatives or provide exclusion criteria. No mention of create_course, update_section, or conditions where a different tool should be used.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_eventA
Reschedule a calendar event to a new timestart. To change name/description/location, delete + re-create (Moodle WS does not expose full event update).
| Name | Required | Description | Default |
|---|---|---|---|
| event_id | Yes | ||
| new_timestart | Yes | New start timestamp (Unix seconds). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It discloses the tool's limited scope (only changes timestart) and warns that full event updates are unavailable, which is key behavioral context. However, it does not mention permissions, return values, or side effects on existing event details, which would have strengthened transparency further.
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 description is two focused sentences, with the primary action front-loaded. The second sentence efficiently conveys the limitation and alternative without redundancy, making every word count.
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 mutation tool, the description covers the core behavior, its limitation, and the recommended alternative for other changes. No output schema exists, but the tool's purpose is fully explained, making it complete for an agent to decide when and how to invoke it.
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 50% (only new_timestart has a description). The description implies the role of event_id (which event) and new_timestart (the new time), but it adds little beyond what the schema already states. It does not elaborate on event_id's format or any constraints beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool reschedules a calendar event to a new timestart, using a specific verb and resource. It also distinguishes itself from siblings by explicitly noting that other changes (name, description, location) are not supported, setting it apart from create/delete event tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says when to use this tool (to reschedule) and when not to (to change name/description/location), providing the alternative of delete + re-create. This is a clear usage guideline with an explicit exclusion, referencing the Moodle WS limitation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_sectionA
Update a course section (name/summary/visible) identified by section_id. At least one field is required. Visibility propagates to all modules inside the section.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | ||
| summary | No | ||
| visible | No | ||
| course_id | Yes | ||
| section_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses a key side-effect—visibility propagates to all modules inside the section—and a validation rule (at least one field required). However, it does not mention permission requirements, reversibility, or return values, which are important for an update operation.
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 description is two concise sentences that front-load the primary action and include a critical behavioral note. No unnecessary words or repetition of schema details.
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?
The tool is moderately simple, but without an output schema, the description should clarify what the agent can expect after a successful update or on errors. It covers the core behavior and the propagation side-effect, but omits return/error handling and permission context, leaving some ambiguity for a well-rounded decision.
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 lists the updatable fields and adds the rule that at least one of them is required, which is not present in the schema. It does not describe course_id and section_id in detail, but those are self-explanatory from the context.
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 clearly states the tool's function: updating a course section with specific fields (name, summary, visible) and identifies the resource by section_id. This distinguishes it from sibling tools like create_section, hide_section, and reorder_sections, which have different operations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for updating section metadata but does not explicitly compare with alternative tools such as hide_section or release_section. It provides clear context (update by section_id and course_id) but lacks explicit exclusions or alternative recommendations, leaving potential ambiguity around the 'visible' field versus dedicated hide/release tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ws_rawA
Escape hatch: call any Moodle Web Services function with arbitrary parameters. Returns { data } on success, structured meta.code + isError: true on failure. Prefer high-level facades when they cover your use case.
| Name | Required | Description | Default |
|---|---|---|---|
| params | No | ||
| function_name | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the transparency burden. It discloses the return shape: 'Returns `{ data }` on success, structured `meta.code` + `isError: true` on failure,' giving agents a concrete expectation of both success and error behavior. The 'escape hatch' metaphor additionally signals that this tool bypasses typical facades, though it does not detail potential side effects or validation behavior.
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 description is composed of two tightly crafted sentences. The first front-loads the core purpose, and the second packs in return format and usage guidance. There is no filler or repetition of schema details.
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 generic escape-hatch tool, the description covers the essentials: what it does, when to prefer alternatives, and the shape of success/failure responses. It could also warn that function calls are not validated and may have destructive effects, but the 'escape hatch' label and the nudge toward high-level facades partially cover that.
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 compensate by explaining parameter meaning. It only says 'with arbitrary parameters,' which essentially repeats the free-form nature of the `params` object already visible in the schema. It does not explicitly state that `params` are passed directly to the Moodle function or how they map to function arguments, leaving a significant gap for a tool that is inherently parameter-driven.
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 opens with 'Escape hatch: call any Moodle Web Services function with arbitrary parameters,' which clearly and specifically identifies the tool's purpose and scope. This distinguishes it from high-level sibling tools that each target a single Moodle operation, positioning ws_raw as a generic passthrough.
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 closing sentence, 'Prefer high-level facades when they cover your use case,' gives explicit guidance on when to use this tool versus the alternatives. It also labels the tool an 'escape hatch,' which implies it should be a fallback option, not the first choice.
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.
45 tool updates
v0.1.0- First observed
archive_course - First observed
assign_to_group - First observed
change_role - First observed
configure_quiz - First observed
confirm_preview - First observed
create_calendar_event - First observed
create_course - First observed
create_forum - First observed
create_forum_announcement - First observed
create_group - First observed
create_section - First observed
delete_event - First observed
delete_resource - First observed
duplicate_course - First observed
duplicate_section - First observed
enrol_csv - First observed
generate_video - First observed
get_assign_submissions - First observed
get_completion - First observed
get_course_context - First observed
get_course_logs - First observed
get_grades - First observed
get_quiz_attempts - First observed
get_quiz_questions - First observed
get_site_info - First observed
grade_manually - First observed
hide_section - First observed
import_gift - First observed
list_calendar_events - First observed
list_my_courses - First observed
list_students - First observed
list_user_badges - First observed
modify_question - First observed
publish_class_lesson - First observed
publish_exam_lesson - First observed
publish_preview - First observed
release_section - First observed
reorder_sections - First observed
reset_password - First observed
send_moodle_message - First observed
unenrol_student - First observed
update_course - First observed
update_event - First observed
update_section - First observed
ws_raw
TDQS
Scored across 45 tools
Most tools have clear, distinct purposes with detailed descriptions. A few pairs like publish_class_lesson/publish_preview and configure_quiz/publish_exam_lesson overlap partially, but the descriptions explicitly guide which to use and when.
The vast majority follow a verb_noun snake_case pattern (create_section, list_students, delete_event). Minor inconsistencies exist, such as mixing list_ and get_ prefixes for retrieval operations and the non-conforming ws_raw, but these are infrequent and do not impede readability.
With 45 tools, the set is significantly larger than the ideal 3-15 range and exceeds the 25+ threshold where tools become unwieldy for an agent to navigate. While the Moodle domain is broad, many tools are highly granular (e.g., generate_video, reset_password) and the volume feels excessive rather than well-scoped.
The tool surface covers a wide range of Moodle operations: course CRUD, sections, quizzes, assignments, enrolments, groups, forums, calendar, and messaging. Notable gaps exist, including single-user creation (only via CSV), course deletion (only archive), assignment creation, and badge awarding (explicitly deferred), but these are workable for most core workflows.
Maintenance
Related MCP Connectors
MCP server for the Inistate platform: module discovery, entry management, and activity submission.
MCP server for building and testing AI agents with multi-model experimentation and insights.
MCP server for AI agents to plan, verify, and deploy Cloudflare-native apps.
MCP server for QPost — lets AI agents publish video and image posts to YouTube, TikTok, Instagram.
Related MCP Servers
- AlicenseBqualityDmaintenanceAn MCP server that enables LLMs to interact with Moodle platforms to manage courses, students, assignments, and quizzes through natural language commands.71143MIT
- AlicenseBqualityDmaintenanceAn MCP server that enables LLMs to interact with the Moodle platform to manage courses, students, assignments, and quizzes.711MIT
- AlicenseAqualityDmaintenanceEnables AI agents to publish and manage pedagogical content in Moodle via Web Services with guaranteed idempotency. It provides tools for course management, lesson publishing, preview workflows, and direct Moodle API access.512MIT
- AlicenseNot gradedqualityDmaintenanceA powerful Model Context Protocol (MCP) server that seamlessly integrates AI assistants with Moodle Learning Management System. Enable your AI assistant to access courses, retrieve educational content, download resources, and search through your learning materials.8MIT