MCP server exposing Moodle Web Services to AI assistants (Claude, Cursor, etc.)
Server has 6 well-named, read-only tools with clear descriptions and basic input schemas. Naming follows verb_noun convention (list_*, get_*, search_*). Descriptions are adequate (50-150 chars) and explain purpose. However, parameter descriptions are sparse or missing entirely for optional params (e.g., 'course_ids' in list_assignments lacks guidance on behavior when omitted). Output schemas are not documented, LLMs cannot predict response structure. Error handling is minimal (generic RuntimeError). No pagination guidance despite list_* tools. Missing parameter constraints (e.g., perpage max 100 is mentioned in description but not enforced). Tool composition is sound, each does one thing. Security is good: credentials injected via env vars, no secrets in params.
Return sections, modules and file URLs for a course. File URLs returned in `contents[].fileurl` require the Moodle token appended as `?token=...` (or use download_file).
List assignments across given courses (or all enrolled if omitted).
List courses the authenticated user is enrolled in. Returns id, shortname, fullname, category id, and visibility.
List quizzes/QCMs in given courses, or all visible quizzes if omitted.
Search the public course catalog by keyword.
Return Moodle site info and the authenticated user's id/username. Use this first to verify the token works.
Output schemas not documented. LLMs cannot predict response structure (fields, types, nesting). Causes agents to guess at downstream field names and risks failed tool chains.
Optional parameters lack clear behavior documentation. 'course_ids' in list_assignments says 'omit to use all enrolled' but does not explain what 'all enrolled' means or how many results to expect. Ambiguous guidance causes LLM confusion.
No pagination support documented for list_* tools. search_courses accepts 'page' and 'perpage' but list_my_courses, list_assignments, list_quizzes do not. Inconsistent pagination API risks context window exhaustion on large result sets.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 59 | 2026-07-28+ | v2 |
Error handling is generic. RuntimeError with Moodle exception message provides no recovery guidance. LLM cannot distinguish retryable errors (timeout) from user-fixable (invalid token) from fatal (malformed request).
Parameter constraints not enforced. 'perpage' in search_courses says 'max 100' in description but no validation. LLM could pass 1000 and receive silent truncation or API error without clear feedback.