Skip to main content
Glama
tcpassos

Moodle Student MCP

by tcpassos

Moodle Student MCP

An MCP server, packaged as a plugin for Claude Code, GitHub Copilot CLI, OpenAI Codex and Gemini CLI, that lets your AI assistant read your Moodle as a student. It uses Moodle's official mobile-app web service, so it only sees what you already see: courses, topics, assignments, deadlines, grades, forums and course files. No admin access needed, and nothing is ever changed on Moodle.

It works with any Moodle site that allows the official mobile app, and with any login method: a Moodle password, or SSO (Microsoft, Google, SAML, CAS) with MFA.

Requires Node.js 22+.

Two ways to use it

On your computer

In the cloud

Where the assistant runs

Claude Code, Claude Desktop, Copilot CLI, Codex, Gemini CLI, Cursor, ... on your machine

Claude Code on the web, CI, remote servers, containers

Install

The plugin (or the MCP server)

A .mcp.json in the repository, or the environment's MCP config

Sign in

A browser window opens; sign in as usual

Sign in once on your computer and pass the token as a secret

Related MCP server: isu-moodle-mcp

Use it on your computer

1. Install

Pick your assistant. The plugin brings the MCP server plus the study and planning skills.

Assistant

Command

Claude Code (plugin)

claude plugin marketplace add tcpassos/moodle-student-mcpclaude plugin install moodle-student@moodle-student-mcp(or /plugin marketplace add … and /plugin install … inside a session)

Claude Code (server only)

claude mcp add moodle-student -- npx -y @tcpassos/moodle-student-mcp

GitHub Copilot CLI

copilot plugin marketplace add tcpassos/moodle-student-mcpcopilot plugin install moodle-student@moodle-student-mcp

OpenAI Codex

codex plugin marketplace add tcpassos/moodle-student-mcpcodex plugin add moodle-student@moodle-student-mcp(or /plugins inside a session)

Gemini CLI

gemini extensions install https://github.com/tcpassos/moodle-student-mcp

Any other MCP client (Claude Desktop, Cursor, VS Code, ...):

{
  "mcpServers": {
    "moodle-student": {
      "command": "npx",
      "args": ["-y", "@tcpassos/moodle-student-mcp"]
    }
  }
}

If a client on native Windows cannot start npx, use "command": "cmd", "args": ["/c", "npx", "-y", "@tcpassos/moodle-student-mcp"]. Claude Code runs plain npx fine.

2. Sign in

Ask your assistant something like "connect to my Moodle" or "what's due this week?". The first time, it asks for your Moodle address and calls the login tool, which opens a browser window (Chrome, Edge, Brave, Chromium or Vivaldi, whichever is installed; nothing is downloaded). Sign in as usual, SSO and MFA included. The window closes and you're done.

Prefer the terminal? Run npx -y @tcpassos/moodle-student-mcp login.

Your Moodle password and token never pass through the chat. The token is kept in your operating system's credential store (Windows Credential Manager, macOS Keychain, Linux Secret Service), or in a private file (0600) where none is available. It is never written into your project. npx -y @tcpassos/moodle-student-mcp status shows who is signed in, and logout removes the saved sign-in.

Use it in the cloud

Signing in needs a browser this program controls, because Moodle only hands its token to the mobile app's moodlemobile:// links. So remote environments are configured instead: you sign in once on your own computer and give the environment the token as a secret.

1. Get the token on your computer

npx -y @tcpassos/moodle-student-mcp login
npx -y @tcpassos/moodle-student-mcp token

token copies two lines to the clipboard, MOODLE_URL=… and MOODLE_TOKEN=…, without showing the token (--print shows it, in a terminal only).

Moodle tokens last 12 weeks by default (each site may change this). When the tools report an expired sign-in, run these two commands again and update the secret.

2a. Claude Code on the web

Cloud sessions don't load your local MCP servers or plugins; they load the .mcp.json committed in the repository the session works on. One-time setup:

  1. In that repository, commit this .mcp.json. It also works on your computer: when the variables are not set they expand to nothing (:-), and the server uses your saved sign-in.

    {
      "mcpServers": {
        "moodle-student": {
          "command": "npx",
          "args": ["-y", "@tcpassos/moodle-student-mcp"],
          "env": {
            "MOODLE_URL": "${MOODLE_URL:-}",
            "MOODLE_TOKEN": "${MOODLE_TOKEN:-}"
          }
        }
      }
    }
  2. At claude.ai/code, edit the environment you use:

    • Environment variables: paste the two lines from token.

    • Network access: choose Custom, add your Moodle host (e.g. www.moodle.unisinos.br) and keep Also include default list of common package managers checked, so npx can download the server.

  3. Start a new session and ask about your Moodle. New values reach a session when it is created.

To also get the skills there, copy the skills/ folders into the repository's .claude/skills/. Environment variables are readable by anything running in the session, Claude included, so keep the environment personal and don't ask Claude to print them.

The environment's network secrets (Add secret) would keep the token out of the session, but they can't carry it: they only add it to an HTTP header (token or username and password), and Moodle reads the token only from the request parameters (wstoken, token).

2b. Other cloud, CI and remote setups

Run the server with npx -y @tcpassos/moodle-student-mcp and set these environment variables (as secrets); they take precedence over a saved sign-in:

Variables

When

MOODLE_URL + MOODLE_TOKEN (or MOODLE_TOKEN_FILE)

Any account, including SSO

MOODLE_URL + MOODLE_USERNAME + MOODLE_PASSWORD

Accounts with a Moodle password (not SSO); the token is fetched and refreshed automatically

If the environment restricts outbound traffic, allow your Moodle host (and the npm registry, for npx).

Tools

Tool

What it does

login

Sign in through a browser window (explains the cloud setup where there is no screen)

auth_status

Who is signed in, on which site, and where the credential comes from

logout

Remove the saved sign-in

whoami

Your name, site, Moodle version and the time zone used for dates

list_courses

Courses you are enrolled in

get_course_contents(course_id)

Sections/topics and activities of a course

list_assignments(course_ids?)

Assignments with due dates

get_submission_status(assign_id)

Whether you submitted, grade and feedback

get_upcoming_deadlines(days=30)

Timeline of pending work

get_grades(course_id)

Your grades in a course

list_forums(course_ids?)

Forums, including the announcements forum

get_forum_discussions(forum_id, limit=10)

Recent posts in a forum

list_files(course_id)

Downloadable files in a course

download_files(course_id, fileurls?)

Download files and return their local paths

Dates are ISO 8601 with an explicit offset (e.g. 2026-10-20T23:59:00-03:00), in your Moodle profile's time zone.

Skills

Installed with the plugin (skills/, in the shared SKILL.md format):

  • moodle-setup: connect or fix the Moodle sign-in.

  • moodle-tasks: prioritized pending work for the week and a plan for the next deadline (also catches undated assignments and dates announced in the news forum).

  • moodle-materials: download a course's PDFs, slides and notebooks and analyze them.

  • moodle-grades: grades across courses, current standing, and what's needed to reach a target.

  • moodle-digest: a briefing of what's new and what's coming; pairs with scheduled runs.

  • moodle-study: a study guide (summary, flashcards, practice questions) from a topic's materials.

Configuration

All optional.

Variable

Default

Purpose

MOODLE_URL

from the saved sign-in

Moodle address

MOODLE_DOWNLOAD_DIR

./materials (or ~/moodle-materials)

Where download_files saves files

MOODLE_TIMEZONE

your Moodle profile zone

IANA zone for dates

MOODLE_BROWSER

auto-detected

Path to a Chromium-based browser for sign-in

MOODLE_CREDENTIAL_STORE

auto

keychain or file

MOODLE_STUDENT_MCP_HOME

%USERPROFILE%\.moodle-student-mcp (Windows), ~/Library/Application Support/moodle-student-mcp (macOS), ~/.config/moodle-student-mcp (Linux)

Where the session and file store live

On Windows the folder is outside AppData on purpose: Claude Desktop is a packaged (MSIX) app, and files its processes create under AppData go to a private copy that terminals and other assistants don't see.

Security and limits

  • Read-only, your data only. Every call goes through your own account's permissions. download_files only fetches files listed in the course, so the token is never sent anywhere else.

  • The token is a password. It never appears in tool results, logs or error messages. token copies it to the clipboard and only prints it with --print in a real terminal. To revoke it: Moodle → Preferences → Security keys.

  • How sign-in works. The server opens Moodle's mobile-app sign-in page (admin/tool/mobile/launch.php) in a throwaway browser profile, reads the token from Moodle's answer over the DevTools protocol, checks that it is signed for this site and this attempt (md5(wwwroot + passport)) and closes the browser. Moodle only hands this token to its app's moodlemobile:// links, which no web page can receive, so signing in needs a browser this program controls: there is no "open a link on your phone" sign-in.

  • Acceptable use. Automated access to your university's Moodle, even read-only, may fall under its IT policy. Keep request volumes modest. Admins can see token usage in the web service logs.

Troubleshooting

Problem

Likely cause

"Not signed in"

Ask the assistant to sign in, or run npx -y @tcpassos/moodle-student-mcp login

Windows: signed in through Claude Desktop, but a terminal or another assistant says "Not signed in"

Versions before 0.2.1 kept the sign-in under AppData, where Claude Desktop's copy is private to it. 0.2.1 and later use %USERPROFILE%\.moodle-student-mcp and pick up the old sign-in by themselves: check with npx -y @tcpassos/moodle-student-mcp@latest status

"Found the saved Moodle sign-in … but could not read its token"

The session is saved, but its token is gone from the OS credential store (removed, or saved by another user account) or its token file is missing: sign in again. Where no credential store works, set MOODLE_CREDENTIAL_STORE=file before signing in

"does not allow the Moodle mobile app service"

The site admin disabled mobile web services

"This environment has no screen"

Cloud sandbox, SSH or container: see Use it in the cloud

Browser window doesn't open

No Chromium-based browser found: install Chrome or Edge, or set MOODLE_BROWSER

Worked for weeks, now "expired"

Moodle tokens last 12 weeks by default: sign in again (and run token again for cloud secrets)

"Moodle rejected the username/password"

The account uses SSO and has no Moodle password: use login instead

A tool returns an empty list

Not enrolled, or no data in that course

Development

npm install
npm test              # unit tests
npm run typecheck
npm run build
node --env-file=.env scripts/smoke.mjs   # exercise every tool against a real Moodle

Inside this repository, run the CLI as node dist/cli.js <command>: here npx @tcpassos/moodle-student-mcp resolves to the local folder (see below).

Release checklist: bump the version in package.json, .claude-plugin/plugin.json, .claude-plugin/marketplace.json, plugin.json, gemini-extension.json and the npx version range in the manifests, then npm publish --access public.

The plugin manifests start the server as npx -y moodle-student-mcp@npm:@tcpassos/moodle-student-mcp@^x.y.z. Hosts start plugin servers inside the plugin folder, whose package.json has the same name, and a plain npx -y @tcpassos/moodle-student-mcp there resolves to that unbuilt local copy instead of the published package.

License

MIT

Available Tools

11 tools
download_filesA

Download course files to ./materials// and return local paths.

Pass fileurls (from list_files) to download specific files, or omit it to download every file in the course. The MCP client can then read the local path of each result (e.g. open a PDF natively). Already-downloaded files of the same size are reused (status "cached").

ParametersJSON Schema
NameRequiredDescriptionDefault
course_idYes
fileurlsNo

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Discloses key behavioral traits: local storage path, caching behavior for already-downloaded files of same size, and return of local paths. No annotations exist, so the description carries the full burden. Could mention error handling or file overwrite behavior, but current detail is sufficient.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise, with no superfluous words. The key action and parameters are front-loaded, and caching detail is placed logically at the end.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema, the description explains the return value and caching. It covers the main workflow but could mention error handling or prerequisites (e.g., course_id must exist). Overall, it is fairly complete for a straightforward download tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description adds meaning for fileurls by linking it to list_files output. However, course_id is not described beyond being required, and its source (e.g., from list_courses) is not mentioned. Schema description coverage is 0%, so the description partially compensates.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Download course files'), the destination ('./materials/<course>/'), and the output ('return local paths'). It differentiates from sibling tools like list_files, which only list URLs without downloading.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly tells when to use the optional fileurls parameter (to download specific files from list_files) and when to omit it (to download all files). This provides clear usage guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_course_contentsA

List the sections/topics and activities of a course.

Use the id from list_courses. For each section, returns its activities (name, type, url, description and completion state when Moodle exposes it).

ParametersJSON Schema
NameRequiredDescriptionDefault
course_idYes

TDQS

A4.2/5.0
Behavior3/5

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 partially discloses the return data (name, type, url, description, completion state) and its reliance on a valid course_id. However, it does not explicitly state it is a read-only operation or describe error behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description consists of two brief sentences, each serving a clear purpose: stating the tool's function and providing usage context and return data details. No unnecessary words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the low complexity (one parameter, no output schema), the description covers the main use case and return fields. It could be more explicit about the data structure (e.g., sections containing activities), but overall it is sufficient for an agent to use the tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The single parameter 'course_id' has 0% schema description coverage. The description adds crucial meaning by stating it should come from list_courses, which clarifies the expected value source beyond the raw integer type.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool lists sections/topics and activities of a course, with a specific verb 'List' and a distinct resource. It differentiates from sibling tools that focus on specific content types (e.g., list_assignments, list_forums).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says to use the 'id from list_courses', providing a clear prerequisite. It does not mention when not to use this tool or alternative tools, but the prerequisite is strong guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_forum_discussionsA

List the recent discussions of a forum.

Use the forum_id from list_forums. Good for checking teacher announcements. Returns title, author, date and the opening message.

ParametersJSON Schema
NameRequiredDescriptionDefault
forum_idYes
limitNo

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description must disclose behavior. It mentions returning 'title, author, date and the opening message', which is useful. However, it does not clarify the limit parameter's role or sorting order, though limit is implied by 'recent'. More explicit details about default limit and ordering would improve transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise with three sentences, front-loading the purpose. Every sentence adds value without redundancy, and the structure is clear and efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema, the description states the return fields. It covers the required parameter usage and a use case. However, it omits details about the limit parameter and does not mention if the results are paginated. Overall, it is fairly complete for a simple list tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must add parameter meaning. It only mentions 'forum_id' in context, but does not explain the 'limit' parameter or its relationship to 'recent'. The description partially covers one parameter and misses the other entirely.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool 'list the recent discussions of a forum', specifying the verb and resource. It differentiates from sibling tool 'list_forums' by focusing on discussions within a forum and adds context for teacher announcements.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It instructs to use 'forum_id' from 'list_forums' and suggests a use case: 'Good for checking teacher announcements.' While it does not explicitly exclude other uses or mention alternatives, the guidelines are clear and helpful.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_gradesA

Show your grades in a course.

Use the id from list_courses. Returns each graded item with your grade, the max, the percentage, the weight and feedback (only YOUR grades).

ParametersJSON Schema
NameRequiredDescriptionDefault
course_idYes

TDQS

A4.2/5.0
Behavior3/5

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 the return format (grade, max, percentage, weight, feedback) and emphasizes 'only YOUR grades,' but it does not explicitly state that the operation is read-only or discuss permissions, rate limits, or side effects. Adequate but not comprehensive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely concise, consisting of two sentences with no extraneous information. Every word serves a purpose, and the key information is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (one parameter, no output schema), the description adequately covers the return fields and scope. It could be more explicit about 'current user' and 'all graded items,' but it is largely complete for an AI agent's needs.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema description coverage, the description adds meaningful guidance by specifying that course_id should come from list_courses. This clarifies the parameter's origin and usage beyond the schema's type definition.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool shows grades for a specific course, using 'your grades' to distinguish from siblings like get_submission_status or list_assignments. It specifies the resource and action effectively.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context by instructing to use the id from list_courses, but it does not explicitly mention when not to use this tool or provide alternatives. It sets expectations for usage without exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_submission_statusA

Show the status of YOUR submission for an assignment.

Use the assign_id from list_assignments. Tells whether you submitted, the submission state, whether it is still editable, whether it was graded, the grade and the teacher's feedback. A status other than "submitted" means it has not been turned in yet.

ParametersJSON Schema
NameRequiredDescriptionDefault
assign_idYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden. It discloses what information is returned (submission state, editable, graded, grade, feedback) and the meaning of the status. It correctly implies this is a read-only operation. No side effects are mentioned, but none are expected for a status check.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise at four sentences, with the first sentence clearly stating the purpose. Every sentence adds value: source of parameter, list of information, status interpretation. No redundant or extraneous information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple tool with one parameter and no output schema, the description comprehensively explains what the tool returns (submission state, editable, graded, grade, feedback) and how to interpret the output. It also provides the parameter source. This is complete for the agent to use effectively.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The sole parameter `assign_id` is explained by referring to `list_assignments` as its source, adding context beyond the schema. Although the schema coverage is 0%, the description provides enough guidance for an AI agent to understand where to get the value. However, it does not specify constraints or format beyond being an integer.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Show the status of YOUR submission for an assignment.' It specifies the verb ('show'), the resource ('submission status'), and the scope ('YOUR submission'). This distinguishes it from sibling tools like get_grades or list_assignments which cover different aspects.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description tells the user to use the `assign_id` from `list_assignments`, providing a clear source for the parameter. It also explains how to interpret the status ('A status other than 'submitted' means it has not been turned in yet'). However, it does not explicitly state when to use this tool versus alternatives, but it is implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_upcoming_deadlinesA

List your upcoming tasks and deadlines (Moodle's "Timeline").

Aggregates assignment due dates, quiz closings, etc., sorted by date. days is the look-ahead window (default 30). This is the best single source for "what do I have to do and by when".

ParametersJSON Schema
NameRequiredDescriptionDefault
daysNo

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so description carries full burden. It describes aggregation and sorting, and parameter behavior, but does not explicitly state that it is a read-only operation or other behavioral traits like access scope (all courses vs. specific). Adequate but not comprehensive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences: first defines purpose, second explains parameter and adds guidance. Front-loaded, no unnecessary words. Maximally concise for the information needed.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a low-complexity tool with one optional parameter and no output schema, the description is nearly complete. Could clarify scope (all courses?) but otherwise sufficient.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, but description explains the 'days' parameter meaning ('look-ahead window') and its default (30). Adds clear value beyond the schema's minimal type and default.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states it lists upcoming tasks and deadlines, aggregated from various sources (assignment due dates, quiz closings), sorted by date. References Moodle's 'Timeline', forming a distinct purpose from siblings like list_assignments or list_courses.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Implicitly recommends as 'best single source' for deadlines, but lacks explicit when-not-to-use or alternatives. The guidance is adequate given the tool's simplicity.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_assignmentsA

List assignments with their due dates.

If course_ids is omitted, searches ALL your courses. Returns course, assignment name, assign_id (for get_submission_status), due date, cutoff date and max grade.

ParametersJSON Schema
NameRequiredDescriptionDefault
course_idsNo

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Without annotations, the description discloses key behaviors: omitting course_ids searches all courses, and it lists the return fields. However, it does not mention rate limits or pagination.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise, front-loaded with the main action, and efficiently explains parameter behavior and return fields without wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema, the description adequately specifies return fields and behavior for a simple list tool with one optional parameter.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description adds meaning by explaining the effect of omitting course_ids and listing return fields, compensating for the 0% schema description coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool lists assignments with their due dates and specifies behavior when course_ids is omitted, distinguishing it from siblings like get_submission_status and get_upcoming_deadlines.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context on when to use the tool, including the effect of omitting course_ids, but does not explicitly mention alternatives or when not to use it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_coursesA

List the courses you are enrolled in.

For each: id (use it in the other tools), name, short name, progress (%) and last access date.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It clarifies that the tool lists only enrolled courses and returns specific fields, but does not disclose potential limitations like pagination, authentication requirements, or performance implications.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two clear sentences with no extraneous information. The first states the core action, the second lists the return fields efficiently.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema and simple input, the description provides enough context for the agent to use the tool. It explains what courses are returned and what data each course contains, but could mention if results are sorted or filtered.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so no parameter information is needed. The description still adds value by detailing the output fields (id, name, short name, progress, last access), which is beyond the empty schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description explicitly states 'List the courses you are enrolled in', which is a specific verb+resource. It distinguishes from sibling tools like 'get_course_contents' or 'list_assignments' by focusing on enrollment status and providing course-level info.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives implicit usage guidance by noting 'id (use it in the other tools)', hinting that this tool is a precursor to other operations. However, it lacks explicit when-to-use, when-not-to-use, or alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_filesA

List the downloadable files of a course (PDFs, slides, notebooks, ...).

Use the id from list_courses. Returns, for each file: filename, mimetype, size, the section/activity it belongs to, and the fileurl to pass to download_files.

ParametersJSON Schema
NameRequiredDescriptionDefault
course_idYes

TDQS

A4.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description must cover behavioral traits. It states it returns specific file details and is a read operation, but does not mention potential limitations like file type filtering or authentication requirements. Adequate but not exhaustive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is four sentences, each serving a purpose: stating the function, providing usage context, and listing returned fields. It is front-loaded and concise with no redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (single parameter, no output schema), the description covers all necessary aspects: purpose, prerequisite (list_courses), returned data, and next step (download_files). It is complete for its context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description adds value by indicating the parameter `course_id` should come from list_courses, which is not in the schema. With 0% schema coverage, this compensates well. However, it doesn't describe the parameter's format or constraints beyond the integer type.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it lists downloadable files of a course, specifies file types (PDFs, slides, notebooks), and lists return fields (filename, mimetype, size, section/activity, fileurl). It differentiates from sibling tools like list_courses and download_files by mentioning the data flow.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description tells the user to use the `id` from list_courses and that the returned `fileurl` is for download_files, providing a clear workflow. It does not explicitly state when not to use the tool, but the context with sibling tools makes it clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_forumsA

List the forums in your courses (includes news/announcements).

If course_ids is omitted, scans all courses. Returns forum_id (for get_forum_discussions), name, type and description.

ParametersJSON Schema
NameRequiredDescriptionDefault
course_idsNo

TDQS

A4.5/5.0
Behavior4/5

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 lists forums and returns specific fields (id, name, type, description). It also explains the parameter behavior. It could explicitly note that it is a read-only operation, but the listing nature implies non-destructive behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences with no wasted words. The first sentence states the main purpose, and the second clarifies the parameter behavior. It is front-loaded and concise.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple list tool with one optional parameter, the description is complete: purpose, return fields, parameter behavior. No output schema needed. Could mention relationship to get_forum_discussions, but not essential.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has one parameter (course_ids) with no description, and schema coverage is 0%. The description compensates fully by explaining that omitting course_ids scans all courses, adding meaning beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool lists forums in courses, includes news/announcements, and distinguishes from sibling tools like get_forum_discussions. It specifies the verb 'list', the resource 'forums in your courses', and notes that it returns forum_id, name, type, and description.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context: if course_ids is omitted, it scans all courses. This guides when to provide the parameter. However, it does not explicitly state when not to use this tool or mention alternatives, though the sibling get_forum_discussions is implied as a follow-up.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

whoamiA

Confirm who you are on Moodle and that the token is valid.

Returns your name, user_id, site name, version and how many web service functions your token may call. Use it to diagnose the connection.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries full burden. It discloses the tool returns name, user_id, site name, version, and function count. It implies no destructive actions. This is transparent for a diagnostic tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences, front-loaded with purpose ('Confirm who you are'), and every word adds value. No fluff or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 0-parameter tool with no output schema, the description lists the return fields (name, user_id, etc.) and usage context. It fully covers what the agent needs to know to invoke it.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has 0 parameters and schema coverage is 100% (vacuous). The description does not need to add parameter info. Baseline for 0 parameters is 4, and the description adequately addresses the lack of parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Confirm who you are on Moodle and that the token is valid.' It uses a specific verb ('confirm') and identifies the resource (identity/token). Among siblings focused on data retrieval, whoami's purpose for authentication is distinct.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description advises 'Use it to diagnose the connection.' This indicates when to use the tool (diagnosis/verification). While it doesn't explicitly state when not to use, the simplicity and lack of alternatives make the guidance clear enough.

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.

  1. 11 tool updatesv0.1.0
    • First observeddownload_files
    • First observedget_course_contents
    • First observedget_forum_discussions
    • First observedget_grades
    • First observedget_submission_status
    • First observedget_upcoming_deadlines
    • First observedlist_assignments
    • First observedlist_courses
    • First observedlist_files
    • First observedlist_forums
    • First observedwhoami

TDQS

A4.2/5.0

Scored across 11 tools

Disambiguation5/5

All 11 tools have clearly distinct purposes: listing resources, fetching details, downloading files, and identity check. No two tools overlap in functionality.

Naming Consistency5/5

Consistent verb_noun pattern: list_ for collections, get_ for single resource details, download_files for action, and whoami for identity. Mix of get_ and list_ is a sensible and predictable pattern.

Tool Count5/5

11 tools is appropriate for a student-facing Moodle MCP. It covers the essential workflows (courses, assignments, forums, files, grades, deadlines) without being excessive.

Completeness3/5

The set covers reading and listing well but lacks tools for student actions such as submitting assignments or posting in forums. This is a notable gap for a student assistant tool.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers