moodle-mcp-server
Allows AI agents to query a Moodle LMS instance via its Web Services API, providing tools for course catalog, user enrollment, assignments, categories, site metadata, user lookup, and optional premium plugins for advanced reporting, user analytics, user directory, and compliance tracking.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@moodle-mcp-servershow me all courses in the current semester"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
moodle-mcp-server — AI-Powered LMS Analytics
Ask your Moodle instance anything. Get structured answers in seconds.
moodle-mcp-server is an open-source MCP (Model Context Protocol) server that connects AI agents directly to Moodle's Web Services API. It is the Moodle connector behind CSMediaPro's broader Agentic Query Layer (AQL) work.
Instead of learning report builders, writing SQL, or exporting CSVs, you ask questions in plain English — the AI agent queries your LMS and returns structured data.
Project home: https://csmediapro.com/products/moodle-mcp-server
npm package: https://www.npmjs.com/package/moodle-mcp-server-aql
MCP Registry: io.github.csmediapro/moodle-mcp-server-aql
Features
Core query tools — course catalog, user enrollment, assignments, category navigation, site metadata, user lookup, and cache management
Premium reporting plugins — optional tools such as course completion reports and recent activity can be attached through the plugin runtime
LLM-agnostic — works with Claude, GPT, Gemini, Ollama, or any MCP-compatible AI client
Zero LMS modification — uses Moodle's existing Web Services API, no plugin installation required
Compliance-ready data handling — secure, efficient data processing with privacy by design
Read-only — never modifies Moodle data, safe for production
Plugin-extensible — drop new tool modules into a directory; tools and optional agent routing hints auto-register at runtime
Related MCP server: Moodle MCP Server
Quick Start
Prerequisites
Node.js 20+
A Moodle instance with Web Services enabled
A Moodle API token (Site administration → Plugins → Web services → Manage tokens)
Use With An MCP Client
Most users launch the server through an MCP client such as Claude Desktop:
{
"mcpServers": {
"moodle-mcp-server-aql": {
"command": "npx",
"args": ["-y", "moodle-mcp-server-aql"],
"env": {
"MOODLE_URL": "https://your-moodle-instance.example",
"MOODLE_TOKEN": "your-moodle-web-services-token"
}
}
}
}Setup From Source
# Clone the repo
git clone https://github.com/csmediapro/moodle-mcp-server
cd moodle-mcp-server
# Install dependencies
npm install
# Configure
cp packages/server/.env.example packages/server/.env
# Edit .env: add your MOODLE_URL and MOODLE_TOKEN
# Run (stdio mode)
npm run server:build
node packages/server/dist/index.jsUser field schema
User field display settings are generated per Moodle instance and stored locally at
packages/server/data/user-field-schema.json. This file is intentionally ignored by git
because it can include site-specific custom profile fields.
After connecting to a Moodle site, run the refresh_user_field_schema tool once to
discover available standard and custom user fields. A minimal example shape is included
at packages/server/data/user-field-schema.example.json.
The user-directory plugin stores a normalized full-user cache with custom profile
fields flattened into top-level keys such as school. Once that cache exists,
list_users can filter cached users in memory, and summarize_user_directory_field
can return cached distinct values and counts. For example, "show unique schools" or
"show schools and number of users assigned to each one" summarizes the cached
school field without another Moodle fetch.
Config identity
The core owns two different server identity fields:
server.id— stable machine identity, for examplemcp_8f3k2q9xserver.name— human-facing display label
If server.id is missing, the core generates one once and persists it to the resolved config file before startup continues.
Environment overrides:
MOODLE_MCP_CONFIGorMOODLE_MCP_SERVER_CONFIG— choose the config file pathSERVER_ID— explicitserver.idoverrideSERVER_NAME— explicitserver.nameoverrideSERVER_VERSION— explicitserver.versionoverride
If server.id is missing and the resolved config path is not writable, startup fails deliberately.
Using the reference client
# From the project root
cp packages/client/.env.example packages/client/.env
npm run client:dev
# Open http://localhost:3000The client will auto-detect your Moodle instance and present a chat interface where you can ask questions in plain English.
Connecting an LLM
moodle-mcp-server needs an AI model to power the natural-language interface. You bring the model — the moodle-mcp-server core and reference client support any MCP-compatible provider.
Option 1: Run Locally (Recommended for Speed & Privacy)
Running a local model keeps all data on your own hardware — nothing leaves your network. Modern quantized models run well on consumer GPUs and even CPU-only setups.
Performance: A quantized 24B model on a single RTX 3090 delivers ~1.5-second responses after the first query — faster than most cloud APIs once the system is initialized.
Via Ollama (easiest)
# Install Ollama: https://ollama.com
ollama pull gemma3:12b # Fast, reliable tool use (~200ms TTFT)
ollama pull qwen3:14b # Strong reasoning, good for complex queries
ollama pull deepseek-r1:14b # Excellent at multi-step chainsThen point the reference client at http://localhost:11434 (Ollama's default).
Via llama.cpp (maximum control)
# Download a GGUF model (example: Devstral 24B Q4)
# Run the llama.cpp server:
llama-server -m devstral-24b-Q4_K_M.gguf --ctx-size 60000 --port 8080Point the reference client at http://localhost:8080/v1.
Recommended local models
Model | Size | Best For | Hardware |
Gemma 3 12B | ~7 GB VRAM | Fast tool calls, straightforward queries | Single consumer GPU |
Qwen 3 14B | ~8.5 GB VRAM | Complex reasoning, multi-tool chains | Single consumer GPU |
Devstral 24B Q4 | ~14.5 GB VRAM | Maximum capability, 60K context | RTX 3090 / 4090 |
Option 2: Cloud Providers
Anthropic (Claude):
export ANTHROPIC_API_KEY=sk-ant-...Select "Anthropic" in the reference client's provider dropdown. Claude Sonnet offers the most reliable tool-calling behavior.
OpenAI (GPT):
export OPENAI_API_KEY=sk-...Select "OpenAI" in the provider dropdown. GPT-4o performs well on structured queries.
Ollama Cloud:
Uses the same API as local Ollama, hosted at https://ollama.com/v1. Good middle ground — faster than local cold starts, more private than big cloud providers.
Option 3: Claude Desktop (Direct MCP)
Claude Desktop connects to the moodle-mcp-server core directly over stdio — no reference client needed.
Add to your Claude Desktop config (claude_desktop_config.json):
{
"mcpServers": {
"moodle-mcp-server": {
"command": "node",
"args": ["/path/to/moodle-mcp-server/packages/server/dist/index.js"],
"env": {
"MOODLE_URL": "https://your-moodle-instance.com",
"MOODLE_TOKEN": "your-api-token"
}
}
}
}Restart Claude Desktop. The server's tools will appear in Claude's tool list — ask questions directly.
Tools
Core Tools (free, open source — AGPL)
Tool | Description |
| Full course catalog with category drill-down |
| Detail view for any course |
| Enrolled users with roles and access data (now supports course name search with interactive selection) |
| All assignments with due dates |
| Full hierarchy with exact parent resolution |
| Instance overview — site name, version, course count |
| Detail view for a Moodle user |
| Courses for a specific user |
| User search by standard Moodle identity fields |
| Search for courses by name with partial matching and interactive selection |
Premium Plugins (available separately)
Advanced Reporting — gradebooks, cross-course comparison, custom report builder
User Analytics — progress tracking, engagement scoring, risk flags
User Directory — cached directory listing and structured filtering across standard and custom profile fields
Compliance Pack — certification tracking, expiration alerts, audit exports
Architecture
User (plain English question)
│
▼
AI Agent (Claude / GPT / Gemini / Ollama / local)
│
▼ MCP Protocol
`moodle-mcp-server`
├── Tool Registry (core + plugins)
├── Agent Runtime Config (core + plugin rules)
├── Optimized Data Layer (secure, efficient data handling)
└── Moodle Client (REST API calls)
│
▼
Moodle Web Services APITransport modes
Stdio —
dist/index.js— runs as a subprocess, used by Claude Desktop and similar clients
The OSS core intentionally ships with stdio only. Any network-facing wrapper, remote supervision, or premium plugin attachment belongs in a separate commercial node agent or wrapper.
Plugin docs
License
AGPL v3 — see LICENSE.
This means you can:
✅ Use the
moodle-mcp-servercore for free, in any environment✅ Modify the source code for your needs
✅ Build and distribute derivative works
You cannot:
❌ Repackage the
moodle-mcp-servercore as a closed-source competing commercial product❌ Offer it as a network service without sharing your modifications
Trademark Notice
Moodle is a trademark of Moodle Pty Ltd. moodle-mcp-server is an independent CSMediaPro project and is not affiliated with, endorsed by, sponsored by, or officially connected to Moodle Pty Ltd or the Moodle project. The name is used descriptively to identify compatibility with Moodle LMS.
Built by CSMediaPro
moodle-mcp-server is built and maintained by CSMediaPro, a software development company specializing in AI integration, systems engineering, and workflow automation.
Contact: contact@csmediapro.com
Available Tools
18 toolsget_agent_runtime_configA
Internal client configuration tool. Returns declarative agent routing, prompt, rewrite, and continuation rules registered by core and loaded plugins.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
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 that the tool is an 'internal client configuration tool', implying access restrictions. It also describes the return content. However, it does not mention authentication needs, error cases, or whether it modifies state (though 'returns' implies read-only).
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. The first sentence ('Internal client configuration tool') is slightly redundant with the tool name but adds context about intended audience. The second sentence provides the valuable detail. Overall efficient but could be tightened.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has no parameters, no output schema, and clear sibling differentiation, the description is complete. It effectively describes the purpose and return content (routing, prompt, rewrite, continuation rules) without leaving 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 tool has zero parameters, so schema description coverage is trivially 100%. The description adds no parameter information, which is acceptable. Baseline for zero parameters is 4, and the description meets that.
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 returns declarative agent routing, prompt, rewrite, and continuation rules. It uses a specific verb ('returns') and identifies the resource (agent runtime config). This differentiates it from sibling tools which are focused on courses, users, and cache.
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 no guidance on when to use this tool versus alternatives. It does not mention when not to use it, prerequisites, or contrast with sibling tools like get_cache_status. Given 18 siblings, explicit usage direction is missing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_cache_statusA
Inspect the Moodle course and category caches without changing them. Reports memory load state, disk cache validity, item counts, file size, TTL, timestamps, version, and Moodle site match. This tool never calls Moodle and never returns cached course or category records.
| Name | Required | Description | Default |
|---|---|---|---|
| target | No | Cache target to inspect: courses, categories, or all |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden and excels: it explicitly states the tool is read-only ('never calls Moodle'), never returns cached course/category records, and lists exactly what is reported (memory load state, disk cache validity, etc.). No contradictions and full 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?
Two concise, front-loaded sentences. The first sentence states the action and passive constraint; the second lists the output specifics and behavioral guarantees. No wasted words, every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only inspector with one enum parameter and no output schema, the description is fully complete: it specifies purpose, scope, constraints, and reported attributes. No gaps given the tool's simplicity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with a single enum parameter that already has a clear description ('Cache target to inspect: courses, categories, or all'). The description does not add new meaning beyond the schema, so the 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 clearly states the action ('Inspect') and the resource ('Moodle course and category caches'), and explicitly distinguishes it from mutation tools by adding 'without changing them'. It also lists specific inspection attributes, making the purpose highly specific and distinguishable from siblings like manage_cache.
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: for inspecting cache state without changes. While it doesn't explicitly say when not to use it or name direct alternatives, the nearby sibling manage_cache implies the alternative for performing cache operations. The lack of explicit when-not guidance prevents a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_capabilitiesA
Show the effective registered tool catalog for this Moodle MCP server. Returns currently callable tools grouped by source: core tools and plugin tools. Table view shows Tool, Source, and Description.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and does so excellently. It explains the tool returns a catalog of callable tools, grouped by source, with a specific table view. This fully describes the tool's behavior—it's a read-only introspection tool with no side effects, which is clearly 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 three sentences with no waste. The first sentence defines the core purpose, the second explains grouping, and the third describes the table view. Every sentence adds distinct value, and it's efficiently front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, no-output-schema introspection tool with 17 sibling tools, the description is highly complete. It could optionally mention that the catalog changes dynamically based on configuration, but that's not a significant gap given the simplicity and self-evident nature of 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?
The input schema has zero parameters and the description confirms this implicitly by not mentioning any required inputs. The tool is purely getter/self-describing, so there is no parameter documentation needed beyond what the schema provides (100% 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?
The description clearly states the tool's purpose: it shows the registered tool catalog for the Moodle MCP server. It specifies the output format (grouped by core and plugin tools) and provides a sample table view with columns, making it unmistakably distinct from the sibling tools like list_courses or get_site_info.
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 it returns 'currently callable tools', implying it should be used when an agent needs to discover what tools are available on this MCP server. It doesn't need when-not-to-use guidance because there is no sibling tool with overlapping functionality—this tool is uniquely for introspection of the tool catalog itself.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_courseA
Fetch complete details for a single Moodle course by ID. Returns full name, short name, summary, category, format, start/end dates, enrollment methods, and completion tracking settings.
| Name | Required | Description | Default |
|---|---|---|---|
| courseid | Yes | Moodle course ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so description must fully cover behavior. It states what details are returned (full name, short name, summary, etc.) which is good, but it does not disclose potential side effects, authentication requirements, or rate limits. For a read-only fetch, it is partially transparent.
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?
Description is one sentence followed by a list of returned fields. It is concise and front-loaded. Could be slightly more structured (e.g., bullet points) but is clear and to the point.
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 fetch tool with one parameter and no output schema, the description is adequate but lacks some completeness. It lists returned fields but does not explain how to interpret them (e.g., date formats), or error conditions (e.g., invalid courseid). There is no output schema to supplement.
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 covers the single parameter 'courseid' with type and description. The description adds semantic meaning by explaining what the tool returns, which helps the agent understand the purpose. Since schema coverage is 100% and there is only one param, the description provides additional 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?
Description uses specific verb 'Fetch' and resource 'complete details for a single Moodle course', clearly distinguishing from sibling tools like 'list_courses' which retrieves a list, and 'search_courses_by_name' which searches. The tool's purpose is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance on when to use this tool versus alternatives (e.g., 'list_courses' or 'search_courses_by_name'). Usage must be inferred from the tool name and description. It's assumed useful for getting detailed info about one course, but no exclusions or context are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_site_infoA
Returns information about the connected LMS instance: site name, version, release, authenticated user, available API functions, and total course count (from the pre-warmed cache). No parameters required — always returns cached data.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
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 clearly states the tool requires no parameters and always returns cached data, which hints at non-destructive, read-only behavior. The mention of 'pre-warmed cache' is a useful behavioral detail that helps the agent understand performance and freshness characteristics.
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: the first provides a clear purpose and list of returned data, the second adds operational constraints. This is concise and front-loaded. Minor point: the list of returned items could be slightly trimmed without loss, but it's already efficient.
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 zero parameters, no output schema, and no annotations, the description is remarkably complete. It tells the agent exactly what data is returned, how it behaves (cached), and what constraints exist (no parameters). No additional information is needed for an agent to correctly invoke this 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?
The input schema has zero parameters and the description confirms this with 'No parameters required'. Schema description coverage is 100%, so there are no undocumented parameters. The description adds value by explaining that the absence of parameters is intentional and that the tool always returns cached data, which is beyond what the schema alone conveys.
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 ('Returns') and a clear resource ('information about the connected LMS instance'). It lists concrete data returned: site name, version, release, authenticated user, available API functions, and total course count. This clearly distinguishes it from sibling tools like list_courses or get_course which operate on different resources.
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 states that no parameters are required and that it always returns cached data. It implies a straightforward use case: calling this tool when you need instance-level metadata. While it doesn't name alternative tools for other contexts, the zero-parameter constraint and specific returned data make the usage context unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_userA
Fetch one Moodle user by exact ID, email, or username. Provide exactly one of id, email, or username. Returns a single structured user record including any custom profile fields.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Exact Moodle user ID | |
| No | Exact email address | ||
| username | No | Exact Moodle username | |
| presentation | No | How much user detail to display. Use compact for workflow steps and full when explicitly asked for all user details. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full responsibility. It accurately notes the tool returns a single structured record and returns custom profile fields. However, it does not mention any error conditions (e.g., what happens if the user is not found, or if multiple identifiers are provided) nor read-only behavior—but the description of 'Fetch' implies idempotent read. While it could be more thorough, it is clear and truthful.
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: first states the action and search criteria, second gives usage constraint, third describes the return. Every sentence adds necessary information without excess. 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 that there is no output schema, the description compensates by stating that a single structured user record with custom profile fields is returned. The 4 parameters are all documented in the schema with full coverage, so no additional parameter explanation is needed. The description covers essential usage and return shape, making it complete for a straightforward fetch 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 description coverage is 100%, so the baseline is 3. The description adds no new semantics beyond the parameter schemas but reinforces that exactly one identifier should be used. No additional format or validation hints are needed, so the score holds at 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 ('Fetch'), the target resource ('one Moodle user'), and the identification methods ('by exact ID, email, or username'). It distinguishes this tool from sibling tools like 'list_users' or 'search_users' by specifying that it returns a single user based on exact match, not a list or fuzzy search.
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 to provide exactly one of the three identifiers (id, email, or username), which guides usage. It does not explicitly compare to alternatives like search_users or list_course_users, but the context of siblings and the tool's purpose imply it is for a direct, exact lookup rather than discovery.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_user_field_schemaA
Admin/config tool: return the current user field schema for this Moodle instance. Shows every known user field (standard + custom), its type, source, and whether it is currently set to display in tables or accept filters. Use this when the user explicitly asks to inspect, configure, show, refresh, or troubleshoot the user field schema or table columns. Do not use this before ordinary requests to list or filter users; call list_users directly with filters instead. If no schema exists yet, the response will tell you to run refresh_user_field_schema. No parameters required.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
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 that the tool is an admin/config tool (implying elevated privileges), describes the return content, and notes the 'no schema' response behavior. Lacks explicit permission requirements, but the context is sufficient for safe tool selection.
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 well-structured, starting with the tool's purpose and gradually adding detail about what it returns, usage guidelines, and fallback. While slightly longer than necessary, every sentence carries meaningful information and 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 zero parameters and no output schema, the description comprehensively covers the tool's functionality: it explains the return value (fields, types, sources, display/filter status), usage constraints, and error handling (no schema leads to a refresh instruction). This is complete for an agent to correctly invoke 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?
The tool has zero parameters, so the schema description coverage is 100%. The description adds no further parameter meaning, which is appropriate. The baseline of 4 applies because with no parameters, the description cannot add value beyond stating 'No parameters 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 returns the current user field schema, listing fields, types, sources, and display/filter status. It distinguishes itself from sibling tools like 'refresh_user_field_schema' and 'update_user_field_schema' by specifying its role as a read-only inspector and directing agents to call 'list_users' for ordinary user queries.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use (inspect, configure, show, refresh, troubleshoot schema) and when not to use (before ordinary user listing/filtering, which should use 'list_users'). Also explains the fallback behavior if no schema exists, directing the agent to run 'refresh_user_field_schema'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_assignmentsA
List all assignments in a Moodle course. Returns assignment ID, name, due date, allowed submission types, grade scale, and whether submissions are open. Does not return student submissions — use a separate tool for that.
| Name | Required | Description | Default |
|---|---|---|---|
| courseid | Yes | Moodle course ID |
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 transparently explains the tool is read-only by listing the returned fields (IDs, names, due dates, etc.) and explicitly states it does not return student submissions, which manages agent expectations well.
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 with no wasted words. The first sentence states the purpose, and the second sets expectations on what is not returned. Essential for a simple tool.
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 has only one parameter, no output schema, and a simple purpose, the description adequately covers the key behavioral information. It lacks details like whether ordering or pagination applies, but for a straightforward listing tool, this is sufficient.
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 100% with a single required parameter (courseid) already documented as 'Moodle course ID' in the schema. The description adds no further clarification about the parameter beyond the schema, so a baseline 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 it lists assignments in a Moodle course with a specific verb ('list') and resource ('assignments'). It distinguishes from siblings like list_courses by specifying the resource, and from tools that return submissions by explicitly stating what it excludes.
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 (listing assignments in a course) and explicitly states what it does not return ('Does not return student submissions — use a separate tool for that'). It doesn't name specific sibling alternatives, but the exclusion is helpful.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_categoriesA
List all LMS categories. Returns category ID, name, description, parent category, path, depth, and course count per category. Supports filtering by parent ID, exact parent name, and pagination. Use this to discover available categories, identify active vs inactive categories, and filter courses by category. Use the exact category ID when querying category-scoped tools.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum categories to return | |
| offset | No | Pagination offset | |
| parent | No | Deprecated alias for parentid. Filter categories by parent category ID (0 = top-level) | |
| parentid | No | Filter categories by parent category ID (0 = top-level) | |
| parentname | No | Filter categories by exact parent category name |
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 that the tool returns a specific set of fields and supports filtering and pagination, which is adequate for a list operation. However, it does not reveal any behavioral traits such as rate limits, permission requirements, or whether results include only active categories by default—leaving some 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—four short, front-loaded sentences—with no unnecessary words. Every sentence adds value: listing return fields, filtering options, use cases, and a cross-tool tip. It is appropriately sized for the tool's complexity.
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 has 5 parameters with 100% schema coverage, no output schema, and is a straightforward list operation, the description covers the key information: what data is returned, filtering, pagination, and how to leverage the data with other tools. It is comprehensive enough, though it could mention default limit/offset behavior for total 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?
Schema description coverage is 100%, so each parameter already has a clear description in the schema. The tool description adds minimal extra meaning beyond what the schema provides, but it does contextualize filtering by mentioning 'parent ID, exact parent name, and pagination' in a usage-oriented way. This justifies the baseline score 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 uses a specific verb ('list') and resource ('LMS categories'), and it clearly distinguishes the tool from siblings by detailing what it returns (e.g., path, depth, course count) and how it can be used for filtering. This differentiates it from tools like 'list_courses' or 'search_courses_by_name'.
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 states when to use the tool ('discover available categories, identify active vs inactive categories, and filter courses by category') and provides a practical pointer to use the exact category ID with other tools. However, it does not mention when not to use it or name specific alternatives among the many siblings, so it lacks explicit exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_coursesA
List all LMS courses visible to the configured API token. Returns course ID, full name, short name, category, category path, and visibility. Supports filtering and pagination via categoryid, categoryname, limit, and offset. When categoryname is used, it must match an existing category name exactly; if multiple categories share that name, the tool will ask for the ID instead of guessing. Use limit and offset for subset requests like first 10 or first 50. Do not request the full course list unless the user explicitly asks for all courses. Use this to discover available courses before drilling into details. Prefer exact category IDs from list_categories when available.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of courses to return | |
| offset | No | Number of courses to skip before returning results | |
| categoryid | No | Filter courses by category ID | |
| categoryname | No | Filter courses by exact category name |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must convey behavioral traits. It clearly states read-only nature via 'visible to the configured API token' and discloses edge-case behavior (ambiguous category name prompts for ID). It could be improved by explicitly stating whether it mutates data or requires special permissions, but the tone and constraints strongly imply safe, read-only use. No contradictions with annotations (none exist).
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 structured with clear sentences: purpose first, then returned fields, filtering options, limitations, and usage recommendations. It is slightly longer than necessary but every sentence adds value. Minor redundancy (mentioning 'limit and offset' twice) prevents a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by listing returned fields (ID, full name, short name, category, etc.). It covers input parameters, filtering, pagination, and usage context. It lacks details on default behavior (what happens if no filters are applied? Is there a default limit?) and does not mention any rate limits or response size constraints beyond the parameter maximum. For a listing tool with moderate complexity, this is mostly complete but has 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 100%—all four parameters are described in the input schema with their types, bounds, and basic purpose. The description adds some value: it explains the use of limit/offset for subset requests, and the categoryname exact-match behavior. However, it does not explain that categoryid and categoryname may be used together or conflict, nor does it clarify whether offset starts from 0 or 1 beyond the schema's minimum 0. Given the high schema coverage, the bar is lower, but the description only adds marginal context 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 starts with a specific action ('List all LMS courses'), identifies the scope ('visible to the configured API token'), and lists the returned fields (ID, name, category, etc.). It also distinguishes the tool from siblings by mentioning category-based filtering and pagination, which aligns with sibling tools like 'list_categories' and 'search_courses_by_name'—making it clear that this tool is for broad discovery.
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 guidance on when to use this tool (discovery before drilling into details, preferring exact category IDs from list_categories) and when not to (avoid full course list unless explicitly asked). It also explains category name matching behavior and edge cases (duplicate names force ID usage). This fully covers usage context and alternatives implied by sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_course_usersA
List enrolled users in a specific Moodle course or across all courses in a specific LMS category. Provide exactly one of courseid, coursename, or categoryid. Returns user ID, full name, email, department, institution, last access timestamps, and enrollment roles. Category mode deduplicates overlapping users across courses before returning results. Use an exact category ID from list_categories when working at category scope.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum users to return | |
| offset | No | Pagination offset | |
| courseid | No | Moodle course ID | |
| categoryid | No | LMS category ID. Aggregates enrolled users across all courses in the category. | |
| coursename | No | Moodle course name for partial matching |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It discloses return fields (user ID, full name, email, etc.) and deduplication behavior. However, it omits details like default ordering, handling of suspended users, permission requirements, and error behavior, leaving several behavioral aspects unclear.
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 tightly written in four sentences, front-loaded with the primary purpose. Every sentence adds essential information: scope, parameter guidance, return fields, deduplication, and a reminder about category ID sourcing. No redundant or vague phrasing.
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 absence of an output schema, the description covers return fields and deduplication. It does not address pagination behavior (limit/offset are parameters but not discussed), error cases, or parameter constraints like partial matching behavior. Still, it provides enough context for typical 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 100%, providing baseline explanations. The description adds value by specifying the mutual exclusivity constraint (exactly one of the three identifiers) and clarifying that categoryid aggregates across courses. This goes beyond the schema's individual parameter 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 lists enrolled users in a specific Moodle course or across all courses in a category. It distinguishes from siblings like search_users and list_courses by specifying the scope and mentioning deduplication in category mode.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly instructs to provide exactly one of courseid, coursename, or categoryid, and advises using an exact category ID from list_categories. It does not explicitly exclude alternatives like get_user or search_users, but the context is clear enough for most agents.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_user_coursesA
List courses for a specific Moodle user ID. Requires an exact userid. Use get_user for exact email or username lookups first. Use search_users when a person is identified by name and multiple matches are possible. If multiple people match, ask the operator to choose the correct userid before calling this tool.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum courses to return | |
| offset | No | Pagination offset | |
| userid | Yes | Exact Moodle user ID |
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 of behavioral disclosure. It notes the requirement for an exact userid and the lookup flow, but does not describe what happens on invalid input, error handling, return format, pagination behavior, or authentication needs. The description is partially transparent but lacks key behavioral details.
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 at five sentences, each serving a clear purpose. It is front-loaded with the main action, then provides prerequisite steps and fallback guidance. No redundancy, and 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?
Given the tool has 3 parameters, no output schema, and no annotations, the description focuses on usage flow but does not explain return values, pagination details, or error handling. It is complete for the user's decision context but incomplete for behavioral understanding. The parameter schema covers the parameter descriptions, but the overall tool behavior is not fully described.
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 100%, so the baseline is 3. The description repeats the userid requirement already present in the schema but adds no additional meaning or context for the limit or offset parameters. It does not enhance understanding beyond what the structured schema provides.
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 lists courses for a specific Moodle user ID, using a specific verb and resource. It distinguishes itself from siblings like list_courses (all courses) and search_users (user lookup) by emphasizing the exact userid requirement.
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 guidance on when to use this tool: when an exact userid is known. It recommends using get_user for exact email/username lookups and search_users for name-based searches, and instructs the agent to ask the operator to choose if multiple matches occur. This is thorough and actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_cacheB
Manage the Moodle course and category caches. Allows refreshing or clearing the in-memory and file-backed caches to ensure data freshness or free up memory. Use 'refresh' to update cache with latest data from Moodle, 'clear' to remove cached data, and 'all' to affect both courses and categories.
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | Action to perform: refresh (update cache) or clear (remove cache) | |
| target | No | Target to affect: courses, categories, or all |
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 states that the tool modifies caches (refresh/clear) and mentions memory implications, but omits important details like required permissions, synchronous vs asynchronous operation, or potential performance impact on other users. The description is adequate but not thorough.
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 and front-loaded: the first sentence states the core purpose. The second adds behavioral context. The third repeats parameter info already in the schema, which could be more concise. Overall, it is efficient but not maximally tight.
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, no output schema, and no nested objects, the description covers the basic functionality. However, it lacks context about side effects, error behavior, required capabilities, and the relationship to sibling tools like get_cache_status. The absence of an output schema is not a problem, but the description should at least hint at what the tool returns (e.g., success indication).
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with both parameters already described in the input schema. The description adds minimal value by repeating the enum values and slightly rephrasing the same information (e.g., 'all to affect both courses and categories'). No new semantic context beyond the schema is provided.
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 manages Moodle course and category caches, with specific actions (refresh/clear) and targets (courses/categories/all). This verb+resource combination is unambiguous and distinguishes it from sibling tools like get_cache_status (read-only) or list_courses (data retrieval).
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 no guidance on when to use this tool versus alternatives (e.g., get_cache_status). It only explains how to use the parameters, not the context or prerequisites. No explicit when-to-use or when-not-to-use advice is given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
refresh_user_field_schemaA
Discover all available user fields from the connected Moodle instance and create or update the user field schema. Samples standard fields from the current user and custom profile fields from enrolled users across courses. Use this when: connecting to a new Moodle instance for the first time, or after a Moodle admin adds/removes custom profile fields, or when the operator asks to 'refresh the user fields'. Optional 'force' parameter (default false): when true, re-merges all fields from scratch (operator overrides on still-existing fields are preserved). When false, compares discovered fields against the stored schema and only updates if there are differences to report.
| Name | Required | Description | Default |
|---|---|---|---|
| force | No | Force a full re-merge from scratch even if nothing changed |
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 explains that the tool samples fields from the current user and enrolled users across courses, that it creates or updates the schema, and that operator overrides on still-existing fields are preserved when force is true. It does not mention return value or potential side effects (e.g., whether it modifies the Moodle instance), but the behavioral details given are sufficient for a refresh 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 concise and well-structured. It leads with the core purpose in the first sentence, then provides additional context, followed by usage guidelines and parameter explanation. Every sentence adds value, and there is no redundancy or fluff. The front-loading of the key action helps the agent quickly understand the tool's 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?
Given the tool has one optional parameter, no output schema, and no annotations, the description is reasonably complete. It covers the action, the scope of data sampled, usage scenarios, and parameter behavior. Minor gaps include not mentioning the output format (e.g., whether it returns a summary or confirmation) and not explicitly stating that this is a write operation. However, the overall coverage is strong for a tool of this complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds significant value beyond the schema: it explains the default value (false), the difference between true and false ('re-merges all fields from scratch' vs. 'only updates if there are differences'), and the preservation of operator overrides. This provides the agent with clear decision-making context for the parameter.
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: 'Discover all available user fields from the connected Moodle instance and create or update the user field schema.' It uses specific verbs ('discover', 'create or update') and a specific resource ('user field schema'), and it distinguishes itself from sibling tools like get_user_field_schema (read-only) and update_user_field_schema (manual update) by focusing on automated discovery from the source.
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 lists three clear use cases: 'when connecting to a new Moodle instance for the first time, or after a Moodle admin adds/removes custom profile fields, or when the operator asks to refresh the user fields.' It also explains the behavior of the force parameter. However, it does not explicitly state when to use alternative tools (e.g., get_user_field_schema for reading) or when not to use this tool, though the context of sibling tools makes this somewhat implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reorder_user_field_schemaA
Reorder displayed user table columns in the user field schema. Use this when the operator asks to move a column left, right, first, last, before another field, or after another field. The field and target values must be exact field keys from get_user_field_schema, such as id, fullname, email, lastaccess, department, institution, or suspended. Natural language examples: 'move last access all the way to the right' → {"field":"lastaccess","position":"end"}. 'move department after email' → {"field":"department","after":"email"}. 'put suspended before lastaccess' → {"field":"suspended","before":"lastaccess"}. 'move full name to the far left' → {"field":"fullname","position":"start"}.
| Name | Required | Description | Default |
|---|---|---|---|
| after | No | Move the field immediately after this displayed field key | |
| field | Yes | Field key to move, e.g. lastaccess, department, email, or suspended | |
| before | No | Move the field immediately before this displayed field key | |
| position | No | Move the field to the far left/start or far right/end of displayed columns |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description bears the full burden of behavioral disclosure. The description reveals no side effects, authentication requirements, rate limits, or failure modes (e.g., what happens if a field key doesn't exist). It is a straightforward reorder operation without additional behavioral context, warranting a moderate score.
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 paragraph with front-loaded purpose ('Reorder displayed user table columns... Use this when...'). The examples are concise and illustrative, adding practical guidance without redundancy. Every sentence serves a clear 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?
Given the moderate complexity (4 params, no output schema), the description covers the main use case well: reordering via relative or absolute positions. It lacks explanation of what happens on success or error, and does not address parameter exclusivity. However, it is close to complete for a focused reorder 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 100%, so the baseline is 3. The description adds value by giving natural language examples mapping to parameter combinations (e.g., 'move department after email' → after parameter), but it does not explain the semantics of required vs. not-allowed parameter combinations (e.g., that after, before, and position are mutually exclusive). The examples illustrate usage but leave restrictions implicit.
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 exactly what the tool does: 'Reorder displayed user table columns in the user field schema.' The verb 'reorder' is specific to the resource 'displayed user table columns'. Among siblings like get_user_field_schema, refresh_user_field_schema, and update_user_field_schema, this description uniquely distinguishes the reordering action.
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 'Use this when the operator asks to move a column left, right, first, last, before another field, or after another field.' It also instructs the agent that field and target values must be exact field keys from get_user_field_schema, listing examples. This tells the agent when to invoke this tool and what inputs to use, effectively differentiating it from siblings like update_user_field_schema.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_courses_by_nameA
Search for courses by name, returning matching courses with their IDs and details. Useful for finding course IDs when you only know part of the course name. Supports partial matching on course full name, short name, and ID number. Case-insensitive search. Returns course ID, full name, short name, category, and visibility. Use this to find course IDs for other tools like list_course_users.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of matching courses to return | |
| searchTerm | Yes | Search term to match against course names (case-insensitive partial match) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description mentions case-insensitive search and partial matching, which are helpful behavioral traits. However, with no annotations provided, the description carries more burden; it does not disclose potential performance concerns for large datasets, rate limits, or whether it returns archived courses. The lack of annotations raises the bar, and the description does not fully compensate.
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 at three sentences, clearly front-loading the purpose and usage context. Each sentence adds value: purpose, when-to-use, and behavioral details (partial matching, case-insensitivity). It could be slightly more compact by removing redundancy (e.g., 'case-insensitive partial match' appears in both description and schema), but overall efficient.
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 is a simple search with two parameters, no output schema, and no annotations, the description adequately covers the key aspects: search behavior, match strategy, return fields, and how to use the results. It doesn't explain pagination or default limit, but those are covered by the schema description for the 'limit' parameter. Minor gaps exist (e.g., what happens when no results), but overall complete for this complexity level.
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 100%, so the schema already documents the two parameters (searchTerm and limit) with descriptions. The description adds some context by mentioning specific fields matched (course full name, short name, ID number) and what is returned (course ID, full name, short name, category, visibility), but this is already implied by the tool's purpose. The baseline of 3 is appropriate as the schema does the heavy lifting.
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 specific verbs ('Search for courses by name') and clearly states the resource (courses) and the matching scope (name, with partial matching on various fields). It distinguishes from siblings like 'list_courses' by emphasizing that this is for finding course IDs when only a partial name is known.
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 states when to use this tool: 'finding course IDs when you only know part of the course name.' It also provides a concrete use case: 'Use this to find course IDs for other tools like list_course_users.' This makes it clear how it fits into workflows and differentiates it from listing all courses.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_usersA
Search Moodle users by firstname, lastname, email, username, or idnumber. Use this for direct person lookup, not structured directory filtering or reports. Provide at least one standard Moodle search field. Moodle performs the filtering first; this tool does not preload the full user directory. If a directory listing plugin is installed, prefer that plugin for filter-style requests. If multiple users match, do not guess downstream actions; select the correct user ID first.
| Name | Required | Description | Default |
|---|---|---|---|
| No | Search by email | ||
| limit | No | Maximum users to return | |
| offset | No | Pagination offset applied after Moodle returns matches | |
| idnumber | No | Search by ID number | |
| lastname | No | Search by last name | |
| username | No | Search by username | |
| firstname | No | Search by first name |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Given no annotations exist, the description must fully disclose behavioral traits. It clarifies that filtering is server-side via Moodle, not preloaded client-side, which is important for understanding performance and accuracy. It also explains the offset pagination (in the offset parameter description). However, it doesn't state what happens on error (e.g., invalid search field, empty result), or whether the tool is read-only/idempotent (implicitly yes, but not stated). Still, with no annotations, this is strong transparency.
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 sentences, each packed with value: the first states purpose and searchable fields; the second provides usage context and behavioral fact; the third gives a critical usage guideline about filtering and handling multiple matches. No wasted words. Front-loaded with the essential 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?
Given the tool has 7 parameters, no output schema, and no sibling tool that does exactly the same (only get_user for specific ID), the description covers usage, behavior, and the key parameter nuance (offset). It does not explain return format or what happens when multiple fields are provided (priority or conjunction), which could be needed for complete understanding. But for a search tool, it is largely sufficient. A 5 would require documenting the return structure or combining logic.
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 baseline is 3. The description does not repeat parameter schemas but adds value by explaining the offset behavior ('applied after Moodle returns matches') which clarifies pagination semantics that the schema alone does not. It also stresses the requirement to provide 'at least one standard Moodle search field', implying that the tool may fail or return no results if used without any filter, which is not obvious from the optional schema. One could argue for a 5, but the score stays at 4 because the added value is not exhaustive (e.g., no guidance on combining multiple 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 clearly states the verb 'Search' and the resource 'Moodle users', and lists the specific search fields (firstname, lastname, email, username, idnumber). This distinctively differentiates it from siblings like list_courses, get_user (which may require a user ID), or list_course_users (which filters by course). The scope is precise.
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 'Use this for direct person lookup, not structured directory filtering or reports.' It provides a prerequisite ('Provide at least one standard Moodle search field'), explains behavior ('Moodle performs the filtering first; this tool does not preload the full user directory'), and names an alternative ('If a directory listing plugin is installed, prefer that plugin for filter-style requests'). It also warns against premature downstream actions when multiple matches occur. This is exemplary guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_user_field_schemaA
Update display and filter settings for specific user fields. Only include fields you want to change — omitted fields keep their current settings. Use this when the operator wants to: show or hide a field in user search result tables (display), or enable/disable a field for schema-aware directory filtering (filterable). This is an admin/configuration tool, not a prerequisite for ordinary filtered user-list requests. FIELD KEYS: Use the exact short field keys from get_user_field_schema (common keys: id, fullname, email, username, department, institution, city, country, firstaccess, lastaccess, suspended, confirmed, idnumber). For a single field, prefer the shortcut fields: field='username', display=false. EXAMPLES: 'hide username from user tables' → {"field":"username","display":false}. 'hide firstaccess and department from user tables' → {"updates":{"firstaccess":{"display":false},"department":{"display":false}}}. 'make city visible in tables and available to schema-aware filters' → {"updates":{"city":{"display":true,"filterable":true}}}. 'show a discovered custom field in tables' → {"updates":{"customFieldKey":{"display":true}}}."
| Name | Required | Description | Default |
|---|---|---|---|
| field | No | Shortcut for updating one field key, e.g. username | |
| display | No | Shortcut value for whether the single field appears in user tables | |
| updates | No | Map of field keys to new settings. Only include fields you want to change. | |
| filterable | No | Shortcut value for whether schema-aware directory tools can use the single field as a filter |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the full burden. It discloses that only included fields change, omitted fields keep current settings, and it's an admin/configuration tool. Could mention permissions or reversibility, but the current disclosure is strong.
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?
Well-structured with purpose first, then usage conditions, field keys, and examples. Slightly verbose but every sentence adds value. The examples are particularly helpful.
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 no output schema, the description need not explain return values. It covers input parameters thoroughly, usage context, field keys, examples, and references sibling tools. All necessary information is present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, but the description adds significant value: explains the shortcut vs. updates parameter, lists common field keys, and provides multiple examples. This goes well beyond the schema's brief 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 'Update display and filter settings for specific user fields' with a specific verb and resource. It distinguishes from siblings like get_user_field_schema (read) and refresh/reorder variants by indicating it's a configuration update tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use: 'when the operator wants to show or hide a field... enable/disable for filtering.' Also clarifies when not to use: 'not a prerequisite for ordinary filtered user-list requests.' Provides field key guidance and examples.
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. Dates show when Glama detected each change.
18 tool updates
v1.0.0- First observed
get_agent_runtime_config - First observed
get_cache_status - First observed
get_capabilities - First observed
get_course - First observed
get_site_info - First observed
get_user - First observed
get_user_field_schema - First observed
list_assignments - First observed
list_categories - First observed
list_course_users - First observed
list_courses - First observed
list_user_courses - First observed
manage_cache - First observed
refresh_user_field_schema - First observed
reorder_user_field_schema - First observed
search_courses_by_name - First observed
search_users - First observed
update_user_field_schema
TDQS
Most tools have distinct purposes, but 'list_course_users' and 'list_user_courses' have similar names and could be confused since both involve listing users and courses. The detailed descriptions help, but the naming overlap introduces mild ambiguity.
The majority of tools follow a clear verb_noun pattern (e.g., list_courses, get_course, search_users). However, 'list_course_users' vs 'list_user_courses' swaps the order of noun and verb, and 'search_courses_by_name' is a longer phrase, breaking the pattern slightly.
With 18 tools, the server is well-scoped for a Moodle LMS integration. Each tool covers a specific function (courses, users, assignments, categories, cache, schema, capabilities) without excess or redundancy, making the set appropriate for the domain.
The server provides solid read-oriented coverage (listing, searching, getting details) and admin schema management, but lacks write operations like creating or updating courses, users, or assignments. This leaves notable gaps for a typical CRUD workflow, though it may be intentional for a read-only agent.
Maintenance
Related MCP Connectors
Hosted MCP server connecting claude.ai, ChatGPT and other AI apps to your own computer
An MCP server that integrates with Discord to provide AI-powered features.
An MCP server that gives your AI access to the source code and docs of all public github repos
- ZapierOAuthcom.zapier
Hosted MCP server connecting AI assistants to 9,000+ apps and 40,000+ actions via Zapier.
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.71542MIT
- AlicenseBqualityDmaintenanceAn MCP server that enables LLMs to interact with the Moodle platform to manage courses, students, assignments, and quizzes.715MIT
- 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.18MIT
- FlicenseNot gradedqualityBmaintenanceA Model Context Protocol (MCP) server that connects AI coding agents to your Moodle LMS. Fetch assignments, grades, deadlines, and sync everything to Obsidian automatically.-
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/csmediapro/moodle-mcp-server'
If you have feedback or need assistance with the MCP directory API, please join our Discord server