moodle-mcp-server
This server lets AI agents query a Moodle LMS via natural language over MCP, returning structured data without modifying the site.
Course discovery & details – List/filter full course catalog, search by name, view course details, and drill into categories.
User management queries – Search users by name/email/username/idnumber, fetch user profiles, list a user’s courses, and list course enrollees with roles across courses or categories.
Assignments – Get assignment lists with due dates, submission types, and grade scales.
Site overview – Retrieve LMS metadata, version, course count, and category hierarchy.
Cache management – Inspect, refresh, or clear course/category caches for data freshness.
User field schema administration – Discover/refresh/update/reorder standard and custom user fields for display/filtering.
Plugin extensibility – Optional reporting/analytics plugins (completion reports, recent activity, etc.) can auto-register tools.
Read-only, compliance-ready – Never modifies Moodle data; works over Moodle’s Web Services API with no LMS plugin.
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 "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@moodle-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.
Separately installed plugins can use this schema to flatten custom profile fields
into stable keys such as school. The premium user-directory plugin, for example,
uses it to cache and summarize full-user directory fields outside the OSS core.
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 structured details for a single Moodle course by ID. Returns full name, short name, summary, category, format, start/end dates, visibility, 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?
With no annotations, the description carries the full burden; 'Fetch' and 'Returns' strongly imply a read-only operation, and the enumerated return fields give useful output context. However, it does not disclose error behavior for a missing course, permission requirements, or that the result is a single object.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with the action and scope front-loaded and the returned fields listed compactly. Minor filler in 'structured details' but no wasted sentences.
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 one-parameter lookup with no output schema, the description compensates by enumerating the returned fields. Only the missing error/not-found behavior keeps it short of 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 100% for the single courseid parameter, so the schema already documents it fully. 'By ID' restates the parameter's role without adding format, range, or sourcing guidance 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?
Specific verb ('Fetch') plus resource ('structured details for a single Moodle course') plus the selecting key ('by ID'). It is clearly distinguishable from siblings like list_courses and search_courses_by_name, which return collections.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the singular scope and ID-based lookup, but the description never states when to prefer this over search_courses_by_name or list_courses, nor what happens if the ID is unknown. No exclusions or prerequisites 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 | |
| _silo | No | INTERNAL: Silo filter injected by agent-edge. Not for direct use. | |
| 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?
With no annotations, the description carries the full burden. It discloses the return shape ('single structured user record including any custom profile fields'), which partially compensates for the missing output schema, but says nothing about permission requirements, behavior when no user matches, or whether the call is 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?
Two sentences, front-loaded with the action and lookup keys, followed by the return shape. No filler and every clause carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-record lookup with a fully described schema and no annotations, the description covers purpose, key selection, and return shape. It lacks error/permission behavior, but nothing critical to making the call correctly is missing.
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 baseline is 3, but the description adds a real constraint the schema does not express: no parameter is marked required, yet the description mandates exactly one of id/email/username. That is genuine semantic value 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?
States a specific verb (Fetch) and resource (one Moodle user) and names the three lookup keys, with 'exact' implicitly contrasting with the fuzzy search_users sibling. It stops short of naming search_users outright, so an agent must infer the boundary rather than being told.
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?
'Provide exactly one of id, email, or username' is a cardinality constraint rather than usage guidance, and the presentation hint is duplicated from the schema. There is no explicit guidance on when to use this over search_users or list_course_users, so the selection 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.
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 LMS courses available to the configured API token. Returns course ID, full name, short name, category, category path, and visibility. Supports filtering and pagination via categoryid, categoryname, visible, 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 visible=false for hidden courses and visible=true for visible courses. 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 | |
| visible | No | Filter by course visibility. false returns hidden courses; true returns visible courses. | |
| 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 exist, so the description carries the burden: it discloses the return fields, the exact-match requirement for categoryname, and the disambiguation behavior (asks for ID rather than guessing) — genuinely useful behavior beyond structured fields. It omits auth/permission specifics (beyond 'configured API token') and any rate-limit or max-page guidance, keeping it short of a 5.
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?
Front-loaded with purpose and return shape, then filters, then usage guidance. Mostly every sentence earns its place, though limit/offset are explained twice (in the filter list and the 'first 10/first 50' sentence), a minor redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description supplies the return fields; with no annotations, it supplies usage and disambiguation rules. For a read-only list tool with 5 optional params, an agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds real semantics: categoryname must match exactly and how ambiguity is resolved, the meaning of visible=true/false, and concrete limit/offset examples ('first 10 or first 50'). It does not restate the 1500 max.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('List LMS courses') scoped to the configured API token, and enumerates the returned fields. The mention of list_categories and get_course lets an agent place it among siblings without opening schemas.
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?
Explicit when-to-use ('discover available courses before drilling into details'), when-not ('Do not request the full course list unless the user explicitly asks for all courses'), and an alternative ('Prefer exact category IDs from list_categories'). Filtering intent for visible and limit/offset is spelled out.
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 |
|---|---|---|---|
| _silo | No | INTERNAL: Silo filter injected by agent-edge. Not for direct use. | |
| 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?
With no annotations, the description carries the full burden and does well: it enumerates the returned fields (ID, name, email, department, institution, last access, roles) and discloses non-obvious semantics such as category-mode deduplication of overlapping users. It omits pagination/result-cap behavior and any auth or rate-limit notes, so it is not fully complete.
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?
Four sentences, each earning its place: purpose, required-argument rule, return payload, and category-mode nuance. The most decision-relevant information (scope and the one-of constraint) is 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?
With no output schema and no annotations, the description compensates by listing return fields and deduplication behavior, which is exactly what an agent needs. Minor gap: no guidance on limit/offset pagination or behavior when the 500-user cap is hit.
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 baseline is 3, but the description adds a mutual-exclusivity constraint ('exactly one of courseid, coursename, or categoryid') that the schema does not express via anyOf/oneOf, plus clarification that coursename is partial-match and categoryid aggregates. That is real added meaning 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?
States a specific verb+resource ('List enrolled users') with two explicit scopes (single course vs. whole category), which cleanly separates it from siblings like search_users and list_user_courses. An agent knows exactly what entity set is returned without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a concrete selection rule ('Provide exactly one of courseid, coursename, or categoryid') and routes the agent to list_categories for valid category IDs. It stops short of naming explicit alternatives to use instead (e.g. search_users for ad-hoc user lookup), so it is clear context without full when-not guidance.
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 |
|---|---|---|---|
| _silo | No | INTERNAL: Silo filter injected by agent-edge. Not for direct use. | |
| 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 carries the full burden. It discloses the critical precondition (exact userid) and the disambiguation workflow, which is valuable. However, it does not mention pagination behavior (despite limit/offset params) or what happens with an invalid userid, leaving some behavioral gaps for a tool with zero annotation coverage.
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?
Four tight sentences, front-loaded with the core action, then prerequisites and disambiguation steps in a logical order. Every sentence earns its place with no 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?
The precondition and disambiguation guidance make the definition usable without opening sibling schemas, which is strong for a lookup tool. It stops short of describing pagination or error behavior for an invalid userid, but for this tool's complexity and with a fully documented schema, it is nearly 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 100%, so the schema already documents userid, limit, offset, and _silo with descriptions and constraints. The description reinforces that userid must be exact, which adds marginal value, but does not explain pagination semantics beyond what the schema provides. 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?
States a specific verb+resource (list courses) with a precise scope (a specific Moodle user ID) and distinguishes itself from siblings list_courses and list_course_users. The requirement of an exact userid is stated immediately.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes to get_user for email/username lookups and to search_users for name-based lookups, and instructs the agent to ask the operator to choose a userid when multiple matches exist. This is a model example of when-to-use and what-to-do-when-ambiguous guidance.
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 |
|---|---|---|---|
| _silo | No | INTERNAL: Silo filter injected by agent-edge. Not for direct use. | |
| 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?
With no annotations, the description carries the behavioral burden and does well: it discloses that Moodle performs filtering server-side and that the tool does not preload the full directory, plus a mutation-adjacent caution about not guessing downstream actions. It does not cover auth/permission requirements or rate limits, which keeps it short of a 5.
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?
Front-loaded with the core verb+resource, then layered with alternatives and cautions in a logical order. It is slightly long with several conditional sentences, but each adds a distinct constraint rather than repeating itself.
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?
An 8-parameter tool with a nested internal _silo object and no output schema, so the description needs to explain behavior; it covers filtering, no-preload, and ambiguous-match handling. It leaves the internal _silo filter unexplained (though the schema marks it INTERNAL) and says nothing about return shape or pagination interaction.
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 enumerated parameters and their meanings are already fully documented in the schema; the description names the standard search fields but adds no syntax, matching semantics, or format detail beyond that. 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?
States a specific verb (search) and resource (Moodle users) plus the exact searchable fields (firstname, lastname, email, username, idnumber), and explicitly distinguishes itself from 'structured directory filtering or reports', routing the agent away from sibling tools like list_course_users.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use (direct person lookup), when-not (filter-style requests, for which it names a directory listing plugin as the preferred alternative), a precondition (provide at least one standard search field), and a downstream rule (select the correct user ID rather than guessing). Nothing is left to inference.
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.
5 tool updates
v0.1.5- Changed
get_user1 field changed- added
Input schema / properties / _siloAdded value: +{ + "description": "INTERNAL: Silo filter injected by agent-edge. Not for direct use.", + "properties": { + "field": { + "type": "string" + }, + "value": { + "type": "string" + } + }, + "required": [ + "field", + "value" + ], + "type": "object" +}
- Changed
list_course_users1 field changed- added
Input schema / properties / _siloAdded value: +{ + "description": "INTERNAL: Silo filter injected by agent-edge. Not for direct use.", + "properties": { + "field": { + "type": "string" + }, + "value": { + "type": "string" + } + }, + "required": [ + "field", + "value" + ], + "type": "object" +}
- Changed
list_courses2 fields changed- changed
Input schema / properties / limit / maximumPrevious value: -200New value: +1500 - added
Input schema / properties / visibleAdded value: +{ + "description": "Filter by course visibility. false returns hidden courses; true returns visible courses.", + "type": "boolean" +}
- Changed
list_user_courses1 field changed- added
Input schema / properties / _siloAdded value: +{ + "description": "INTERNAL: Silo filter injected by agent-edge. Not for direct use.", + "properties": { + "field": { + "type": "string" + }, + "value": { + "type": "string" + } + }, + "required": [ + "field", + "value" + ], + "type": "object" +}
- Changed
search_users1 field changed- added
Input schema / properties / _siloAdded value: +{ + "description": "INTERNAL: Silo filter injected by agent-edge. Not for direct use.", + "properties": { + "field": { + "type": "string" + }, + "value": { + "type": "string" + } + }, + "required": [ + "field", + "value" + ], + "type": "object" +}
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
Scored across 18 tools
Most tools have clearly distinct targets: search_courses_by_name vs list_courses, get_user vs search_users, and the four user_field_schema tools (get/refresh/update/reorder) are separable. Minor overlap exists where list_course_users and list_user_courses both span users and courses (opposite directions), and get_capabilities vs get_agent_runtime_config are both meta-tools that an agent could confuse.
All 18 tools use clean snake_case with a consistent verb_noun pattern (get_*, list_*, search_*, manage_*, refresh_*, update_*, reorder_*). The single deviation, search_courses_by_name, is still readable and follows the same convention family.
18 tools is slightly heavy for a read-oriented LMS client, with 4 tools devoted to user-field-schema administration and 2 to cache management. Each earns a place, but the schema-management cluster inflates the surface beyond the core browse/search workflow.
Course, user, and category discovery are well covered, but list_assignments explicitly delegates submissions to 'a separate tool' that does not exist, creating a dead end. Grade/submission retrieval and enrollment management are absent, leaving notable gaps for a full LMS surface.
Maintenance
Related MCP Connectors
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.
Driflyte MCP server which lets AI assistants query topic-specific knowledge from web and GitHub.
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.711 npm43MIT
- AlicenseBqualityDmaintenanceAn MCP server that enables LLMs to interact with the Moodle platform to manage courses, students, assignments, and quizzes.711 npmMIT
- 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.20 npmMIT
- 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.-