Skip to main content
Glama

Monash Study Kit

Type Tech Release License Access

CI Monash Study Kit MCP server – quality and maintenance score on Glama

English · 中文

Connect Monash Moodle and Ed to Claude, then just ask Claude:

  • "What's due this week?": Moodle deadlines, assignments you may have missed, unfinished Ed lessons, latest announcements

  • "Anything new on Ed? Has anyone replied to my question?"

  • "Which week of FIT2102 covered monads? Which slide deck, which page?"

  • "What does the A2 spec ask for?", "What's my current grade in FIT2109?"

Everything stays on your own computer: course files, login state and the database live locally and never pass through a third-party server. All tools are read-only: they never submit assignments, attempt quizzes or post on Ed.

Built for Monash Malaysia (times are handled as UTC+8); Australian campuses work too, see the FAQ.


Two parts, one codebase

The same core (login, sync, queries) serves two kinds of "users":

MCP: the interface for Claude. Moodle and Ed both sit behind Okta + MFA, so Claude cannot get in by itself. The MCP server lets Claude look things up mid-conversation (tools such as get_study_todo, search_content, list_ed_updates):

  • Answers come from real data: deadlines, announcements and grades are fetched live, with sources such as "Workshop 5 Slides, page 25".

  • Both platforms at once: one "what do I need to do this week" checks Moodle deadlines, unfinished Ed lessons and announcements from both.

  • No manual copying: no downloading PDFs and re-uploading them. Claude finds the right file and reads only the pages it needs, saving time and usage.

  • Natural follow-ups: "What does the A2 spec require?" "Explain that week's functor material using the lecture notes."

CLI (the monash command): the interface for humans.

  1. Things only a person can do: installation, passing MFA in the login window, pasting the Ed token (tokens should never go through a chat, so they are only entered in the terminal).

  2. No AI needed: out of usage or just want a quick look? monash todo answers in a second (see Works without Claude usage).

  3. Troubleshooting and maintenance: status, sync, update, uninstall.

In short: MCP turns Claude into a TA who knows your units; the CLI handles setup, login and fallback. Ask in Claude day to day, open the terminal occasionally.

Related MCP server: moodle-mcp

Requirements

  • Claude Desktop (download) or Claude Code

  • Chrome, Edge or Brave (the Edge that ships with Windows is fine), used to log in to Moodle

  • A Monash account

Installation

macOS

Open Terminal (search "Terminal" in Launchpad) and run these one at a time:

curl -LsSf https://astral.sh/uv/install.sh | sh

After it finishes, close Terminal and open it again, then:

uv tool install https://github.com/Waldo0926/monash-study-kit/archive/refs/heads/main.zip
monash setup

Windows

Open PowerShell (search "PowerShell" in the Start menu) and run these one at a time:

powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"

After it finishes, close PowerShell and open it again, then:

uv tool install https://github.com/Waldo0926/monash-study-kit/archive/refs/heads/main.zip
monash setup

uv is a Python tool manager. It sets up Python for you, so you don't need to install Python yourself.

First-time setup (monash setup)

Follow the prompts. There are four steps:

  1. Ed: opens Ed's API token page. Click Create Token, name it anything, copy the token and paste it back into the terminal (nothing is shown while pasting; that's normal). The token doesn't expire; delete it on the same page whenever you want to revoke it.

  2. Moodle: opens a separate browser window. Log in to Monash as usual (Okta + MFA). The window closes automatically once you're in. This window has its own profile and is completely isolated from your everyday browser: the tool only takes the Moodle session from this window and never reads anything from your normal browser.

  3. Units: tracks this semester's units by default, or pick your own.

  4. Connect to Claude: adds monash to Claude Desktop and Claude Code automatically.

    • On macOS it quits Claude Desktop first (Claude overwrites config edits made while it is running), then reopens it.

    • On Windows it asks you to fully quit Claude Desktop first: tray icon at the bottom right → right-click → Quit.

At the end you can choose to sync right away. The first sync downloads all course files and takes a few minutes to around a quarter of an hour.

Then open Claude Desktop: under "+" → Connectors in the chat box you'll see monash. Leave it switched on.

Everyday use

Just ask in Claude. While Claude is open, the tool works in the background:

  • syncs Ed and Moodle every hour (new posts, replies, course files) and refreshes the full-text index;

  • refreshes the Moodle session every 20 minutes (Moodle logs you out after 4 idle hours).

Not sure what to ask?

Use your own words: Claude picks tools by meaning, not keywords, so both "anything due this week" and "did I forget to submit something" reach the to-do tool. To see everything it can do:

  • Ask Claude "what can you do", or choose one of monash's preset prompts from the "+" menu: feature overview, this week's to-dos, Ed updates, find a topic, quiz review, grades and feedback. Presets are only sent when you click them, so they cost nothing otherwise.

  • Run monash help in the terminal: every feature with an example question and the matching command.

When the Moodle login expires

After shutdown or a long sleep, the Moodle session expires. Claude will tell you and ask whether to log in. If you agree, it opens the login window on your computer; if Okta still remembers you, it logs in silently without even showing the window. You can also run it yourself:

monash login

While the login is expired, deadlines still work (they come from Moodle's calendar subscription link, which needs no login), and Ed features are unaffected.

Works without Claude usage

The CLI doesn't use AI and consumes no usage. Run monash sync first, then:

I want to know

Command

What to do this week

monash todo

Deadlines

monash due (or monash due FIT2102)

Which file / page covers a topic

monash grep "git rebase"

New Ed posts and replies

monash ed new

Replies to my own posts

monash ed following

Read a full post

monash ed show FIT2102#42

Grades / possibly missed assignments

monash moodle grades FIT2102 / monash moodle assignments --missing

The difference is that nobody summarises for you; you get the raw information. Background sync and Moodle session refresh run alongside Claude Desktop: while Claude is open they keep running even if your usage is exhausted; if Claude is closed, run monash sync before querying and monash login if Moodle has expired.

Other AI clients

MCP is an open protocol and monash mcp is a standard local (stdio) MCP server, so any client that supports local MCP servers should in principle work. monash setup only configures Claude Desktop and Claude Code automatically; the clients below need manual configuration.

⚠️ None of the clients below have been tested. The configuration follows each vendor's official docs (as of 2026-09); the official docs take precedence. Only Claude Desktop and Claude Code have been tested.

Step 1: find the full path of the monash program (many clients don't inherit your terminal's PATH, so a full path is safer)

  • macOS: run which monash, usually /Users/<you>/.local/bin/monash

  • Windows: run (Get-Command monash).Source in PowerShell, usually C:\Users\<you>\.local\bin\monash.exe

Replace /full/path/monash in the examples with your path. In JSON, Windows backslashes must be doubled (C:\\Users\\...); in TOML, use single quotes ('C:\Users\...').

Step 2: configure your client

Client

Config location

Status

Codex CLI / Codex in the ChatGPT desktop app / Codex IDE extension

~/.codex/config.toml (shared by all three)

Untested

Cursor

~/.cursor/mcp.json

Untested

VS Code (Copilot)

Command Palette → MCP: Open User Configuration

Untested

Gemini CLI

~/.gemini/settings.json

Untested

ChatGPT web / mobile app

n/a

Not supported: only remote servers, cannot reach a program on your computer

Codex (~/.codex/config.toml), or simply run codex mcp add monash -- /full/path/monash mcp:

[mcp_servers.monash]
command = "/full/path/monash"
args = ["mcp"]

Cursor (~/.cursor/mcp.json) and Gemini CLI (~/.gemini/settings.json) use the same format:

{
  "mcpServers": {
    "monash": { "command": "/full/path/monash", "args": ["mcp"] }
  }
}

VS Code (mcp.json; note the outer key is servers, not mcpServers):

{
  "servers": {
    "monash": { "command": "/full/path/monash", "args": ["mcp"] }
  }
}

If the file already lists other servers, add the monash entry rather than overwriting the whole file. Restart the client afterwards.

Notes:

  • Login and unit selection are still done with monash setup. Without Claude installed, the last step reports "Claude Desktop not found"; just ignore it.

  • Background sync and Moodle session refresh only run while the client is open and the MCP server is running.

  • Tool descriptions are written with Claude in mind. Other models usually follow them fine, but this hasn't been verified.

  • If you'd rather not bother, the CLI works with no AI at all (see Works without Claude usage); you can paste the output of monash todo and friends into any AI.

What can be searched

monash grep and Claude's course-material search cover:

  • Moodle course files (PDF, Word, PowerPoint, text and code)

  • PDFs in Ed Lessons, plus content pages written directly in Ed

  • Course-notes websites: many units publish notes on a lecturer's public site, e.g. tgdwyer.github.io for FIT2102 or yqtian-se.github.io for FIT2109. Pages of this kind linked from Moodle or Ed are fetched, converted to text and stored in the Course notes (web) folder of your course files. Only pages the unit links to directly are fetched (no site-wide crawling), and each page is re-fetched at most once a week. University websites, videos, Google Docs and similar are skipped. To turn it off: monash config web_notes false

  • Lecture-recording transcripts (only with the [media] extra installed)

Privacy and security

  • Where data lives:

    • macOS: ~/Library/Application Support/monash-study-kit

    • Windows: %LOCALAPPDATA%\monash-study-kit

    It contains course files (files), the database (data), login credentials (secrets, readable only by your own user account) and the dedicated login window's profile (browser-profile). Run monash open to open the course-files folder.

  • Stored credentials: the Moodle session cookie, the Ed API token and the Moodle calendar subscription link. They stay on your computer and are only used to talk to Moodle / Ed. Never send the secrets folder to anyone.

  • What Claude can see: only what a tool returns when you ask something (e.g. a list of deadlines, the full text of a post, the text of a course file). Tokens and cookies are never sent to Claude. Don't paste your Ed token into a chat either; it is only entered in the terminal.

  • What it does to Moodle / Ed: read-only. Requests are spaced out, so it never hammers university systems like a crawler.

  • Complete removal:

    monash uninstall
    uv tool uninstall monash-study-kit

    monash uninstall removes it from Claude and asks whether to delete all data. Finally, delete the token on Ed's settings page.

Command reference

You can also query directly in the terminal without Claude:

Command

What it does

monash status

Login status, last sync time

monash help

Everything it can do, each with an example question and the matching command

monash doctor

Health check when something breaks: checks each item and tells you how to fix it; send the whole output to whoever helps you

monash todo

This week: deadlines, possibly missed work, unfinished Ed lessons, announcements, unread replies

monash due [FIT2102]

Deadlines

monash grep "monad" [FIT2102]

Full-text search over course files, course-notes sites, Ed lesson pages and recording transcripts (with page numbers / timestamps)

monash sync

Sync now

monash login / monash login ed

Log in to Moodle / replace the Ed token

monash courses

Re-pick tracked units

monash open

Open the course-files folder

monash moodle grades [FIT2102]

Grades and feedback

monash moodle assignments --missing

Possibly missed assignments

monash moodle news / find / get / messages / calendar

Announcements / find an activity / download one file / messages / calendar subscription link

monash ed new / following / search / show FIT2102#42

Ed updates / new replies to my posts / search / read a post

monash ed lessons FIT2109 / quiz FIT2109

Ed lesson progress / quiz questions (for revision)

monash ed read FIT2109 "W3 Pre-Class"

A whole lesson as Markdown: text slides, reading pages and PDFs in order, plus its quiz questions

monash config

View / change settings (restart Claude Desktop afterwards)

monash update

Update to the latest version

Add --json for JSON output (output is JSON automatically when piped; --text forces text). Every command has --help.

Exit codes (for scripts): 0 success, 1 bad arguments, 2 login required (monash login / monash login ed), 3 cannot reach Moodle/Ed or the server returned an error, 4 unit or post not found, 130 interrupted with Ctrl-C.

Lecture-recording transcripts (optional)

To let Claude know what was said in class, recordings can be turned into timestamped transcripts:

  • YouTube links in Ed "Week N … Recording" posts: YouTube captions are fetched directly, which is fast;

  • Zoom recordings: downloaded with the passcode from the post, then transcribed on your computer with Whisper (a two-hour lecture takes 20–30 minutes on an ordinary laptop).

These dependencies are large (about 1 GB) and not installed by default. To get them, reinstall with [media]:

uv tool install --reinstall "monash-study-kit[media] @ https://github.com/Waldo0926/monash-study-kit/archive/refs/heads/main.zip"

Then run it manually when needed (it never runs in the background, so it won't slow your computer down):

monash media

Videos uploaded directly to Moodle aren't downloaded by default either (often hundreds of MB); they are recorded as links. To download them: monash config download_videos true.

Updating

monash update

Restart Claude Desktop afterwards. On Windows it tells you to quit Claude first and which command to run next (a running program can't be overwritten).

You'll be told when a new version is out: an extra line after terminal commands, and a short mention when you ask Claude for your to-dos. It checks GitHub at most once a day and sends no personal information; to turn it off: monash config update_check false.

FAQ

monash doesn't show up in Claude

Run monash setup claude to reconnect. On Windows, fully quit Claude from the tray first. If it still fails, check for errors under Claude Desktop → Settings → Developer.

The login window won't open / "no browser found"

Install Chrome or Edge. If your browser lives somewhere unusual, point to it: monash config browser "C:\Program Files\...\chrome.exe". If an earlier dedicated login window is still open, close it first.

"Path too long" when syncing course files on Windows

By default Windows limits full paths to 260 characters, and unit name + week name + file name can exceed that. Store course files somewhere shorter: monash config files_dir C:\Monash, then monash sync.

Australian campuses

Moodle shows times in your account's time zone; the default is Malaysia (UTC+8). For Australian campuses: monash config tz_offset 10 (11 during daylight saving).

Where are Ed "assignment deadlines"?

Most Ed lessons have no due date; Moodle is the source of truth for deadlines. The Ed-lesson part of get_study_todo follows your own progress (it lists unfinished lessons up to the week after the one you've reached).

Something is broken

Run monash doctor and follow the → after each item. If you need help, send the whole output; it contains no tokens, cookies or similar. You can also just tell Claude "monash isn't working" and it will run the same checks. The MCP background log is mcp.log in the data directory.

Development

uv sync
uv run pytest
uvx ruff check src tests
uv run monash --help

Releasing: whenever src/ changes, bump __version__ in src/monash_study_kit/__init__.py (patch for bug fixes, minor for new features); the update notice compares against this number on main. The CI version-bump check blocks PRs that forget it. Note what changed in CHANGELOG.md.

How it fits together

flowchart LR
    Claude["Claude Desktop / Claude Code"] -- "stdio (JSON-RPC)" --> MCP["mcp_server"]
    You["You, in a terminal"] --> CLI["cli / cli_ed"]
    MCP --> Core
    CLI --> Core
    subgraph Core["Shared core (runs on your computer)"]
        Jobs["jobs: sync + session refresh"]
        Query["features / edquery / todo"]
        Index["content_index: SQLite FTS5"]
    end
    Core -- "session cookie, read-only" --> Moodle["Moodle"]
    Core -- "API token, read-only" --> Ed["Ed"]
    Core -- "public pages only" --> Notes["Course-notes sites"]
    Login["browser_login + cdp: dedicated login window"] -- "Moodle cookie only" --> Core

Module

What it does

moodlelib, htmldom

Moodle client (cookie session, AJAX calls, downloads that never send the cookie off-site) and a small HTML tree for page parsing

syncer

Mirrors each unit's Moodle files into Unit/Week NN - Title/ folders

features, todo

Deadlines (with an iCal fallback when the session has expired), grades, assignments, announcements, the combined to-do list

edlib, edsync, edquery

Ed API client, incremental sync of posts and replies, local queries

lessons, lesson_reader

Ed Lessons: progress, slides, quiz questions, a whole lesson as Markdown

content_index, textextract, webnotes

Full-text search over PDFs, Office files, course-notes websites and transcripts

browser_login, cdp

Dedicated login window driven over the Chrome DevTools Protocol (a minimal WebSocket client in the standard library)

jobs, mcp_server, cli

Sync and keep-alive jobs, the MCP server, the command line

doctor, help_menu, update_check, claude_setup

Health check, help and preset prompts, new-version notice, adding the server to Claude

recordings, transcribe

Optional: lecture recordings to timestamped transcripts ([media] extra)

The only runtime dependency is pypdf; everything else (HTTP, SQLite, WebSocket, HTML parsing) uses the standard library. Tests run on macOS, Windows and Ubuntu with Python 3.10 and 3.13 in CI, and ruff checks for syntax errors, undefined names and unused imports.

License

MIT. This is an independent student-built tool, not affiliated with Monash University, Ed or Anthropic.

Available Tools

17 tools
get_ed_lessonsA
Read-only

读取 Ed Lessons:列进度、读单节或测验。Ed 讨论用 search_ed_threads;跨课件全文搜索用 search_content。返回 Lesson 列表/进度、正文或测验内容。

ParametersJSON Schema
NameRequiredDescriptionDefault
quizNotrue=返回测验而非 Lesson 列表
courseYes课程号,如 FIT2102
lessonNoLesson 名称或编号;有值=读正文
moduleNo可选模块名称或编号
offsetNo正文字符起点,默认0
statusNo完成状态筛选
max_charsNo最大字符数,默认30000,最高100000

TDQS

A4.4/5.0
Behavior4/5

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

readOnlyHint=true already covers the safety profile, so the description's added value is its disclosure of mode-dependent output (Lesson list/progress, lesson body, or quiz content), which is meaningful because there is no output schema. It does not detail pagination or the offset/max_chars return behavior, keeping it just short of full 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?

Three compact sentences, zero filler. Purpose and modes come first, alternatives second, return value last – well front-loaded and each sentence earns its place.

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?

With no output schema, the description usefully covers return values and routes to siblings, which is sufficient for a mode-switching read tool. Minor gaps remain around pagination behavior across the offset/max_chars parameters, but the schema documents those.

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?

Schema description coverage is 100%, so the baseline is 3. The description gestures at the mode switching (list/lesson/quiz) but the concrete semantics (quiz=true returns quiz, lesson with a value reads the body) are already spelled out in the schema, so the description adds little beyond what structured fields provide.

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?

States a specific verb+resource (读取 Ed Lessons) and enumerates its three modes: list progress, read a single lesson, or read a quiz. It explicitly names the sibling tools it is not (search_ed_threads for discussions, search_content for full-text search), so an agent can distinguish it without opening any schema.

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?

Names two alternatives with the exact condition that selects each: use search_ed_threads for Ed discussions and search_content for cross-courseware full-text search. This is explicit when-to-use-else guidance, not implied.

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

get_monash_statusA
Read-only

诊断登录、同步、索引和错误状态;报错或“用不了”时用。只需刷新数据用 sync_monash_data;登录过期且用户同意后用 start_monash_login。返回状态摘要或完整体检。

ParametersJSON Schema
NameRequiredDescriptionDefault
fullNotrue=完整诊断;false=简要状态

TDQS

A4.5/5.0
Behavior4/5

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

With readOnlyHint=true already covering the safety profile, the description adds that the tool returns either a status summary or a full checkup ('返回状态摘要或完整体检'), which tells the agent what output to expect. It doesn't describe auth requirements or rate limits, but for a read-only diagnostic tool this addition is meaningful beyond the annotation.

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 front-loaded with the tool's purpose, then usage guidance, then alternatives, in three tight sentences with no wasted words. Every sentence earns its place by either defining scope or routing to siblings.

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 read-only diagnostic tool with one optional boolean parameter and no output schema, the description covers purpose, usage, alternatives, and expected return format. Annotations handle safety, and nothing an agent needs to call it correctly is missing.

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?

Schema description coverage is 100%, and the single parameter's meaning ('true=完整诊断;false=简要状态') is fully captured in the schema itself. The description's mention of '状态摘要或完整体检' maps to the same boolean but adds no syntax or format detail beyond what the schema already provides, so baseline 3 applies.

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 verb 'diagnose' and lists specific resources: login, sync, indexing, and error status. It explicitly distinguishes itself from sibling tools by naming sync_monash_data and start_monash_login with their appropriate use cases, so an agent can tell them apart 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.

Usage Guidelines5/5

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

It gives explicit when-to-use guidance ('报错或“用不了”时用') and names two alternative tools with the conditions that select them ('只需刷新数据用 sync_monash_data'; '登录过期且用户同意后用 start_monash_login'). This is exactly the kind of when/when-not/alternatives routing that usage guidelines require.

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

get_moodle_gradesA
Read-only

读取 Moodle 成绩;无 course 看总览,有 course 看评分项、得分和反馈。提交状态用 list_moodle_assignments,不用于截止日历。

ParametersJSON Schema
NameRequiredDescriptionDefault
courseNo课程号;省略=成绩总览
graded_onlyNotrue=仅已有成绩的项目

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, so the safe-read profile is covered. The description adds value beyond that by disclosing the output-shaping behavior (overview vs. detailed grade items/feedback), though it says nothing about permissions, pagination, or caching.

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?

Compact single statement, front-loaded with the purpose, then the conditional output, then the boundary cases. Every clause earns its place with no filler.

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?

With no output schema, the description carries the return-value burden and does so, explaining that callers get an overview or grade items/scores/feedback depending on the course param. Sufficient for a two-parameter read 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?

Schema description coverage is 100%, so both parameters are already documented in the schema. The description reinforces the course/no-course branch but adds no format or constraint detail beyond what structured data provides, making the baseline 3 correct.

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?

Specific verb+resource ('读取 Moodle 成绩') and it distinguishes itself from siblings by naming list_moodle_assignments and the due-date calendar explicitly. An agent can tell this apart from list_moodle_assignments/list_moodle_due without opening any schema.

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?

Explicit when-to-use routing: with no course param it returns an overview, with course it returns grade items/scores/feedback. It also names the correct alternative for submission status and states what it is NOT for (deadlines). 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.

get_moodle_messagesA
Read-only

读取 Moodle 私信;无 conversation_id 列对话,有值则读该对话,且不会标已读。论坛内容用 search_moodle_forum。返回对话或消息。

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo数量上限;默认对话20、消息30
conversation_idNo对话 ID;省略=列对话

TDQS

A4.3/5.0
Behavior4/5

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

With readOnlyHint=true already declared, the description adds valuable context beyond annotations: that reading messages does not mark them as read, and that it returns conversations or messages depending on the input. It does not cover permissions, rate limits, or pagination, but the added behavioral detail is meaningful.

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 very concise and front-loaded, starting immediately with the core purpose. Every sentence carries useful information, and there is no redundant or filler text.

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 simple two-parameter tool, no output schema, and existing readOnly annotation, the description covers all an agent needs: what it does, how the parameters affect behavior, when to use an alternative (forum), and what it returns. Nothing essential is missing.

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?

Schema description coverage is 100%, so the parameter meanings are already fully documented in the schema. The description reiterates the conversation_id behavior (without it lists conversations, with it reads that conversation) but adds no new semantic details such as formats, constraints, or edge cases.

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 states a specific verb (读取/read) and resource (Moodle 私信/private messages), and explicitly distinguishes from the sibling search_moodle_forum by saying forum content should use that tool instead. It also clarifies the conditional behavior based on conversation_id, making the tool's scope unambiguous.

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 provides an explicit alternative for forum content (search_moodle_forum), which is the most likely source of confusion among siblings. However, it does not explicitly state when to use this tool versus other non-forum Moodle tools, nor does it mention prerequisites or exclusions beyond the forum case.

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

get_study_todoA
Read-only

综合查看 Moodle/Ed 待办:截止、漏交、Lesson、公告和未读回复;问“这周要做/交什么”用。只查截止用 list_moodle_due;查提交状态用 list_moodle_assignments。返回分类待办。

ParametersJSON Schema
NameRequiredDescriptionDefault
daysNo未来天数,默认7

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, covering the safety profile. The description adds genuine context beyond that: it discloses the aggregation scope across multiple sources and that output is categorized ('返回分类待办'). No auth/pagination behavior is described, but for a read-only reader this is adequate.

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

Conciseness5/5

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

Three tight clauses: purpose/scope, trigger context, and sibling routing. Zero filler and the aggregation scope is front-loaded before the alternatives.

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?

Complete for a read-only aggregator: purpose, when-to-use, alternatives, and return shape ('返回分类待办') are all present, and annotations handle safety with no output schema needed. Minor gap is the absence of any note on result volume or freshness, but nothing essential is missing.

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?

Schema coverage is 100% and the single 'days' parameter is fully documented in the schema (未来天数, 默认7). The description adds no syntax or format details beyond that, so baseline 3 applies 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.

Purpose5/5

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

States a specific verb+resource (综合查看 Moodle/Ed 待办) and explicitly enumerates what it aggregates: deadlines, missed submissions, Lessons, announcements, unread replies. It also names the sibling tools it is not (list_moodle_due, list_moodle_assignments), so an agent can distinguish it 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.

Usage Guidelines5/5

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

Gives explicit trigger context ('问"这周要做/交什么"用') and clear when-not routing: deadlines only → list_moodle_due, submission status → list_moodle_assignments. Alternative selection is fully specified rather than inferred.

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

list_coursesA
Read-only

列出 Moodle/Ed 课程;问有哪些课或其他工具需要先确定课程时用。Moodle 未登录时回退本地课程表。返回课程代码、名称和标识。

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

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

readOnlyHint=true already tells the agent this is a safe read, so the bar is lower; the description still adds real behavior by disclosing the fallback to the local course table when Moodle is not logged in. It does not describe pagination or result size limits, but the fallback note is substantive context beyond the annotation.

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?

Front-loaded with the verb and resource, then two short qualifiers (when to use it, fallback behavior) and the return fields. Every clause carries information and nothing is repeated from structured data.

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?

With no output schema, the description compensates by naming the returned fields (course code, name, identifier), and it covers the login-state edge case. For a zero-parameter listing tool that is complete enough to call correctly.

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 takes zero parameters, so there is nothing for the description to disambiguate; baseline 4 applies. The description correctly does not invent parameter guidance.

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?

States a specific verb+resource (列出课程/list courses) and names both data sources (Moodle/Ed). It also positions itself as the course-discovery hub that other tools depend on, which distinguishes it from the content-specific siblings like get_moodle_grades or list_moodle_due.

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?

Gives two concrete use conditions: when the user asks what courses exist, and when another tool first needs to resolve a course. No explicit when-not or named alternative is provided, but the triggering contexts are clear.

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

list_ed_updatesA
Read-only

列 Ed 新帖、新回复和本人相关未读回复;浏览/搜索历史帖子用 search_ed_threads,读完整帖子用 read_ed_thread。返回更新分组和同步时间。

ParametersJSON Schema
NameRequiredDescriptionDefault
peekNotrue=查看但不推进更新游标
limitNo活动上限,默认30
sinceNo起始时间:7d/12h/2w 或 ISO 日期时间
courseNo课程号,如 FIT2102;省略=全部

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, so the safety profile is covered. The description adds value beyond that: it discloses the return shape (更新分组 and 同步时间) and, via the personal-scope wording plus the peek cursor semantics, signals that this is a cursor-advancing personal feed. That is meaningful context on top of the annotation.

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

Conciseness4/5

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

Three tightly packed clauses that are front-loaded: what it lists, then the sibling routing, then the return shape. No wasted words, though the sibling routing could be trimmed slightly.

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 read-only list tool it is essentially complete: annotations carry the safety profile, all params are schema-documented, and the description even states the return structure (groups + sync time) despite no output schema. Nothing critical is missing.

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?

Schema description coverage is 100%, so all four parameters (peek, limit, since, course) are already documented in the schema, including the cursor behavior of peek. The description adds no syntax or format detail 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.

Purpose5/5

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

States a specific verb (列/list) and resource (Ed 新帖、新回复、本人相关未读回复), and explicitly contrasts with the two sibling tools search_ed_threads and read_ed_thread. An agent can distinguish this from its siblings without opening either schema.

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 routes the agent: browse/search historical posts → search_ed_threads, read a full post → read_ed_thread, while this tool surfaces fresh updates. The when-to-use and alternatives are named directly rather than implied.

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

list_filesA
Read-only

列已同步本地课件或外链,不搜索正文;搜正文用 search_content,读取 path 用 read_file。返回文件/外链和可供 read_file 使用的路径。

ParametersJSON Schema
NameRequiredDescriptionDefault
weekNo教学周编号,如 8
linksNotrue=列外链;须同时给 course
queryNo按文件名或路径筛选
courseNo课程号,如 FIT2102;省略=全部

TDQS

A4.4/5.0
Behavior4/5

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

With only readOnlyHint=true in annotations, the description adds genuine context beyond structured data: it discloses the return content (files/links) and that returned paths are consumable by read_file, enabling chaining. It stops short of pagination or ordering behavior, so not 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.

Conciseness5/5

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

Three tight clauses, front-loaded with the primary action and immediately followed by exclusions and alternatives. No filler sentences; every clause carries routing or return-value information.

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?

No output schema exists, and the description compensates by stating the return contents and the downstream usability of paths. That is sufficient for a read-only list tool, though result ordering or filtering interactions between week/links/query are left unaddressed.

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?

Schema description coverage is 100%, so the schema already documents week, links, query and course. The description only implies the links scope (列外链) without adding format or default semantics beyond the schema, so baseline 3 applies.

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?

States a specific verb (列/list) and resource (已同步本地课件或外链), and explicitly scopes it as not searching content. It draws clear boundaries against the siblings search_content and read_file, so an agent can route 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.

Usage Guidelines5/5

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

Gives explicit negative guidance (不搜索正文) plus named alternatives with their selecting conditions: search_content for full-text, read_file for reading a path. This is exactly the when/when-not/alternatives pattern.

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

list_moodle_assignmentsA
Read-only

列 Moodle 作业及截止、提交和可用成绩状态;仅看日历截止用 list_moodle_due,仅看成绩/反馈用 get_moodle_grades。missing_only 可只看可能漏交。

ParametersJSON Schema
NameRequiredDescriptionDefault
courseNo课程号,如 FIT2102;省略=全部
missing_onlyNotrue=仅可能漏交的作业

TDQS

A4.2/5.0
Behavior3/5

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

readOnlyHint=true already tells the agent this is a safe read. The description adds the scope of returned data (deadline, submission, grade status) and the meaning of missing_only, but says nothing about pagination, result volume, or whether course omission aggregates across all courses beyond the schema's '省略=全部'.

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?

One dense sentence that front-loads purpose, then routes to the two alternatives, then notes the key filter mode. No filler and no repetition of the tool name or title.

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 2-optional-parameter, read-only list tool with no output schema, the description covers purpose, alternatives, and the main filter well. Minor gap: no mention of result shape or multi-course aggregation behavior, but nothing blocking correct invocation.

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?

Schema description coverage is 100%, so both parameters are already documented (course format example, missing_only semantics). The description only restates the missing_only behavior, adding no new format or value detail beyond the schema, so the baseline 3 applies.

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?

States a specific verb (列/list) and resource (Moodle 作业) plus the exact scope it covers: 截止、提交和可用成绩状态. It also names the two sibling tools it is not, so an agent can route without opening any schema.

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 gives when-to-use-this vs alternatives: use list_moodle_due for calendar deadlines only, get_moodle_grades for grades/feedback only. It even flags the missing_only filter as a conditional usage mode.

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

list_moodle_dueA
Read-only

列 Moodle 未来截止和日历事件;需要提交状态/作业详情用 list_moodle_assignments,需要成绩用 get_moodle_grades。未登录可回退 iCal。返回截止事件和时间。

ParametersJSON Schema
NameRequiredDescriptionDefault
daysNo未来天数,默认14
courseNo课程号,如 FIT2102;省略=全部

TDQS

A4.4/5.0
Behavior4/5

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

The readOnlyHint already marks it as a safe read. The description adds meaningful behavior beyond annotations: it discloses the iCal fallback when not logged in and says it returns deadline events and times. It does not cover rate limits or pagination, but those are minor here.

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 compact and front-loaded: purpose first, sibling alternatives next, fallback and return content last. Every clause carries useful selection or behavior information.

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 two-parameter read-only list tool with no output schema, the description is nearly complete: it states scope, alternatives, auth fallback, and return content. Only minor details such as exact event ordering or timezone handling are absent.

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?

Schema description coverage is 100%, so days and course are already documented in the schema. The description does not add parameter syntax or constraints beyond the schema, so it meets the baseline 3.

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 gives a specific verb+resource: listing Moodle future deadlines and calendar events. It explicitly distinguishes the tool from list_moodle_assignments and get_moodle_grades, so an agent can select it without opening sibling schemas.

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?

It states when to use this tool (upcoming deadlines/calendar events) and names the correct alternatives for submission status/assignment details and grades. It also gives a fallback condition for unauthenticated use, leaving little to inference.

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

read_ed_threadA
Read-only

读取单个 Ed 帖子正文和回复;找帖子用 search_ed_threads,新动态用 list_ed_updates;live=true 先刷新。返回 Markdown,长内容支持分页。

ParametersJSON Schema
NameRequiredDescriptionDefault
liveNotrue=先从 Ed 实时刷新该帖
offsetNoMarkdown 字符起点,默认0
threadYes帖子 ID、FIT2102#42 或 Ed 链接
max_charsNo最大字符数,默认30000,最高100000

TDQS

A4.4/5.0
Behavior4/5

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

Annotations only declare readOnlyHint=true, so the description carries the rest: it discloses the return format (Markdown), that long content is paginated, and that live=true triggers a real-time refresh from Ed. It does not cover auth requirements or error behavior, but the read-only safety profile plus format/pagination disclosure is solid added value.

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?

A single compact sentence with the core action front-loaded, followed by sibling routing and the live flag, then return format. No redundant or filler text.

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 read tool with no output schema, the description supplies the essential missing pieces: output format (Markdown), pagination support, refresh semantics, and sibling alternatives. Remaining gaps (auth prerequisites, error cases) are minor for a read-only thread fetch.

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?

Schema coverage is 100%, so all four parameters (thread, live, offset, max_chars) are already documented in the schema. The description only reinforces pagination and live refresh at a high level, adding little syntax or constraint detail 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.

Purpose5/5

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

States a specific verb and resource: read a single Ed thread's body and replies. It explicitly distinguishes itself from the two nearest siblings (search_ed_threads for finding, list_ed_updates for new activity), so an agent can pick it without opening any schema.

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?

Gives explicit routing: use search_ed_threads to locate a thread and list_ed_updates for new activity, implying this tool is for fetching a thread you already have an identifier for. It also states the live=true precondition for refreshing before reading.

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

read_fileA
Read-only

读取 list_files/search_content 给出的课件路径;ZIP 用 inner,长内容用 offset/max_chars 分页。若要搜索未知文件先用 search_content。返回文本或 ZIP 清单。

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYeslist_files/search_content 返回的路径
innerNoZIP 内路径;省略=列 ZIP 清单
offsetNo字符起点,默认0
max_charsNo最大字符数,默认20000,最高100000

TDQS

A4.6/5.0
Behavior4/5

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

readOnlyHint=true already declares the safety profile, so the description's job is to add context, which it does: ZIP archives are traversed via `inner`, long payloads are paginated with offset/max_chars, and the return is text or a ZIP listing. It stops short of error behavior (missing path, oversized file, encoding), but the added behavioral detail exceeds the annotation.

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?

Three compact clauses, front-loaded with the primary action and dependency, then the ZIP and pagination conditions, then the fallback search guidance. Every sentence carries distinct operational information with zero padding.

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?

With readOnlyHint covering safety and a 100%-documented schema, the description closes the remaining gaps by stating the return shape (text or ZIP listing) and the pagination model, which matters since no output schema exists. Only minor error/edge-case behavior is absent.

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 100%, so the baseline is 3, but the description adds use-case meaning: `inner` is the ZIP-internal selector (omitted = list the ZIP) and offset/max_chars are the pagination pair for long content. That is modest but genuine value beyond the raw schema strings.

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?

States a specific verb (读取/read) and resource (课件路径/course material file), and pins the scope to paths produced by list_files/search_content, distinguishing it from those siblings. An agent can tell this is the terminal read step in the list/search -> read workflow without opening any schema.

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 routes the agent: paths come from list_files/search_content, and if the target file is unknown, use search_content first. This is a named alternative plus the condition that selects it, leaving nothing to inference.

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

search_contentA
Read-only

全文搜索已同步课件/PDF/笔记/字幕;只列文件用 list_files,拿到 path 后用 read_file。返回匹配片段、文件路径和定位信息。

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo命中上限,默认15,最高50
queryYes全文搜索关键词或短语
courseNo课程号,如 FIT2102;省略=全部

TDQS

A4.5/5.0
Behavior4/5

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

Annotations only declare readOnlyHint=true, so the description carries the rest; it discloses the return shape (matching snippets, file paths, and location info), which is valuable since no output schema exists. It stops short of pagination/limit behavior or scope limits beyond the sibling routing, so not 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.

Conciseness5/5

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

Single dense sentence, front-loaded with the core purpose and return values, followed by sibling routing. Every clause earns its place with no waste.

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?

Covers purpose, alternative selection, and return content in one line for a read-only search tool whose annotations already carry the safety profile. 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.

Parameters3/5

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

Schema coverage is 100%, so all three params (query, limit, course) are already documented in the schema. The description adds no syntax or format detail beyond what the schema provides, so the baseline 3 applies.

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?

States a specific verb (全文搜索/full-text search) and precise resource scope (已同步课件/PDF/笔记/字幕), and explicitly names the sibling tools it is not (list_files, read_file). An agent can distinguish this from every sibling without opening a schema.

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?

Gives explicit when-to-use-alternative routing: use list_files to merely enumerate files, and read_file once a path is obtained. This establishes a clear workflow and names the conditions that select each alternative.

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

search_ed_threadsA
Read-only

浏览或搜索 Ed 帖子;读完整正文/回复用 read_ed_thread,只看新动态用 list_ed_updates。返回帖子摘要;浏览模式支持 offset 分页。

ParametersJSON Schema
NameRequiredDescriptionDefault
onlyNo状态筛选:收藏/关注/未看/本人/未读回复
typeNo帖子类型
limitNo条数上限,默认15,最高50
queryNo搜索标题/正文;省略=浏览帖子
sinceNo起始时间:7d/12h/2w 或 ISO 日期时间
courseNo课程号,如 FIT2102;省略=全部
offsetNo浏览结果偏移;搜索时忽略
categoryNoEd 分类
unansweredNotrue=仅未回答问题

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, so safety is covered. The description adds behavior beyond that: the tool returns post summaries (not full bodies) and browse mode supports offset pagination, which is genuinely useful call-shaping context.

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 tight sentences, front-loaded with the core verb+resource, followed by the routing alternatives and return/pagination note. No filler.

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?

With no output schema, the description still tells the agent the return shape ('post summaries') and the pagination mode, and it points to siblings for full content. Complete enough for a read-only search tool, though return fields and summary limits are only roughly characterized.

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?

Schema description coverage is 100% — every one of the 9 parameters is already documented with enums, defaults and limits. The description only echoes the offset/pagination behavior, which the schema already notes as ignored during search. Baseline 3 is appropriate.

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?

States a specific verb (browse/search) and resource (Ed posts), and explicitly distinguishes itself from two siblings — read_ed_thread for full body/replies and list_ed_updates for new activity. An agent can route among the three without opening any schema.

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?

Names both alternatives with the exact condition that selects each: full content -> read_ed_thread, new activity only -> list_ed_updates. This is explicit when-to-use/when-not guidance, not inferred context.

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

search_moodle_forumA
Read-only

查看/搜索 Moodle 公告和论坛:无 query 看公告,有 query 搜索。Ed 讨论请用 search_ed_threads。返回公告或匹配帖子摘要、正文片段和链接。

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo数量参数;默认公告5、搜索10
queryNo搜索词;省略=最近公告
courseNo课程号,如 FIT2102;省略=全部

TDQS

A4.5/5.0
Behavior4/5

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

The readOnlyHint annotation already covers the safety profile. The description adds return behavior: announcements or matching post summaries, body snippets, and links. It does not discuss pagination, rate limits, or auth, but those are less critical for a simple read-only search 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?

Very compact and front-loaded: the core behavior appears first, followed by the key alternative and return summary. Every clause earns its place 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?

For a read-only search tool with full schema coverage and annotations covering safety, the description supplies the missing context: query/no-query behavior, sibling routing, and expected return content. No output schema exists, but the description adequately summarizes returns.

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?

Schema description coverage is 100%, so all three parameters are fully documented in the schema itself. The description reinforces the query semantics and return shape but adds little parameter-level detail beyond what the schema already provides.

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?

States a specific verb and resource: viewing/searching Moodle announcements and forums. It also distinguishes the query/no-query behavior and names the sibling tool search_ed_threads for Ed discussions, so an agent can identify its scope 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.

Usage Guidelines5/5

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

Explicitly says what to do without a query (see announcements), what to do with a query (search), and which alternative to use for Ed discussions (search_ed_threads). Usage conditions and exclusions are directly stated.

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

start_monash_loginA

仅在用户明确同意重新登录后使用:打开本机 Moodle 登录窗口;已登录则不重复打开,成功后自动同步。诊断请用 get_monash_status。

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.6/5.0
Behavior4/5

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

Adds real behavioral context beyond the readOnlyHint=false annotation: it requires explicit user consent, it is idempotent ('if already logged in, won't open again'), and it triggers an automatic data sync on success. It does not say what happens on failure/cancellation or that it opens an interactive window that blocks, which keeps it from 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.

Conciseness5/5

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

The consent precondition is front-loaded in the first clause, followed by behavior, then the routing hint to the diagnostic sibling. No redundant or filler sentences.

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?

With no parameters and no output schema, the description covers purpose, precondition, idempotency and the sync side effect, which is nearly all an agent needs. Error/cancellation behavior and what 'success' returns are the only unaddressed pieces.

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 takes zero parameters, so there is nothing for the description to disambiguate. Baseline 4 applies; the sentence about consent and idempotency is about invocation context rather than parameter semantics.

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?

States a specific verb and object: opens the local Moodle login window, and it explicitly names the sibling tool (get_monash_status) that should be used instead for diagnostics. An agent can distinguish it from every other sibling without reading the schema.

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?

Gives an explicit precondition ('only after the user has explicitly agreed to re-login') and an explicit exclusion/alternative ('for diagnostics use get_monash_status'). Both when-to-use and when-not-to-use are spelled out.

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

sync_monash_dataA

刷新 Moodle/Ed 本地数据和全文索引;用户要求刷新或数据过旧时用。诊断错误用 get_monash_status;已在同步时不会重复启动。

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.6/5.0
Behavior4/5

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

Annotations only declare readOnlyHint=false, so the description carries most of the behavioral burden and does add value: it discloses idempotency (no duplicate launch while syncing) and that a full-text index is rebuilt alongside local data. It stops short of stating expected duration, rate limits, or what state changes result, so it is strong 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?

Three tight clauses with the core action front-loaded, followed by the usage trigger and the sibling routing. 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.

Completeness4/5

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

For a zero-parameter action tool with no output schema, the description covers what it does, when to call it, the alternative, and the concurrency guard. It leaves the post-sync result state unstated, but nothing essential to invoking it correctly is missing.

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 takes zero parameters, so there is nothing for the description to disambiguate and the baseline of 4 applies. The description correctly implies no arguments are needed by giving a plain trigger-based invocation.

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?

States a specific verb (刷新/refresh) plus the exact resources affected (Moodle/Ed local data and full-text index), which no sibling claims. An agent can distinguish it from get_monash_status and the many read-only search/list siblings without opening any schema.

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?

Gives explicit triggers (user asks for a refresh, or data is stale) and names the alternative for a different need (diagnosing errors → get_monash_status). It also states the when-not condition: if a sync is already running it will not start a second one.

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. 28 tool updatesv0.1.4
    • Removedcourses
    • Removeded_lessons
    • Removeded_thread
    • Removeded_threads
    • Removeded_updates
    • Addedget_ed_lessons
    • Addedget_monash_status
    • Addedget_moodle_grades
    • Addedget_moodle_messages
    • Addedget_study_todo
    • Addedlist_courses
    • Addedlist_ed_updates
    • Addedlist_moodle_assignments
    • Addedlist_moodle_due
    • Removedmonash_login
    • Removedmonash_status
    • Removedmonash_sync
    • Removedmoodle_assignments
    • Removedmoodle_due
    • Removedmoodle_forum
    • Removedmoodle_grades
    • Removedmoodle_messages
    • Addedread_ed_thread
    • Addedsearch_ed_threads
    • Addedsearch_moodle_forum
    • Addedstart_monash_login
    • Removedstudy_todo
    • Addedsync_monash_data
  2. 14 tool updatesv0.1.3
    • Changeded_lessons6 fields changed
      • addedInput schema / properties / lesson / description
        Added value: +"Lesson 名称或编号;有值=读正文"
      • changedInput schema / properties / max_chars / description
        Previous value: -"最大返回字符数"New value: +"最大字符数,默认30000,最高100000"
      • addedInput schema / properties / module / description
        Added value: +"可选模块名称或编号"
      • changedInput schema / properties / offset / description
        Previous value: -"字符偏移"New value: +"正文字符起点,默认0"
      • addedInput schema / properties / quiz / description
        Added value: +"true=返回测验而非 Lesson 列表"
      • changedInput schema / properties / status / description
        Previous value: -"完成状态"New value: +"完成状态筛选"
    • Changeded_thread4 fields changed
      • addedInput schema / properties / live / description
        Added value: +"true=先从 Ed 实时刷新该帖"
      • changedInput schema / properties / max_chars / description
        Previous value: -"最大返回字符数"New value: +"最大字符数,默认30000,最高100000"
      • changedInput schema / properties / offset / description
        Previous value: -"字符偏移"New value: +"Markdown 字符起点,默认0"
      • addedInput schema / properties / thread / description
        Added value: +"帖子 ID、FIT2102#42 或 Ed 链接"
    • Changeded_threads8 fields changed
      • changedInput schema / properties / course / description
        Previous value: -"课程号,如 FIT2102"New value: +"课程号,如 FIT2102;省略=全部"
      • changedInput schema / properties / limit / description
        Previous value: -"最多返回条数"New value: +"条数上限,默认15,最高50"
      • changedInput schema / properties / offset / description
        Previous value: -"结果偏移"New value: +"浏览结果偏移;搜索时忽略"
      • addedInput schema / properties / only / description
        Added value: +"状态筛选:收藏/关注/未看/本人/未读回复"
      • addedInput schema / properties / query / description
        Added value: +"搜索标题/正文;省略=浏览帖子"
      • addedInput schema / properties / since / description
        Added value: +"起始时间:7d/12h/2w 或 ISO 日期时间"
      • addedInput schema / properties / type / description
        Added value: +"帖子类型"
      • addedInput schema / properties / unanswered / description
        Added value: +"true=仅未回答问题"
    • Changeded_updates4 fields changed
      • changedInput schema / properties / course / description
        Previous value: -"课程号,如 FIT2102"New value: +"课程号,如 FIT2102;省略=全部"
      • changedInput schema / properties / limit / description
        Previous value: -"最多返回条数"New value: +"活动上限,默认30"
      • addedInput schema / properties / peek / description
        Added value: +"true=查看但不推进更新游标"
      • addedInput schema / properties / since / description
        Added value: +"起始时间:7d/12h/2w 或 ISO 日期时间"
    • Changedlist_files4 fields changed
      • addedInput schema / properties / course / description
        Added value: +"课程号,如 FIT2102;省略=全部"
      • addedInput schema / properties / links / description
        Added value: +"true=列外链;须同时给 course"
      • addedInput schema / properties / query / description
        Added value: +"按文件名或路径筛选"
      • addedInput schema / properties / week / description
        Added value: +"教学周编号,如 8"
    • Changedmonash_status1 field changed
      • addedInput schema / properties / full / description
        Added value: +"true=完整诊断;false=简要状态"
    • Changedmoodle_assignments2 fields changed
      • changedInput schema / properties / course / description
        Previous value: -"课程号,如 FIT2102"New value: +"课程号,如 FIT2102;省略=全部"
      • changedInput schema / properties / missing_only / description
        Previous value: -"仅可能漏交"New value: +"true=仅可能漏交的作业"
    • Changedmoodle_due1 field changed
      • addedInput schema / properties / course / description
        Added value: +"课程号,如 FIT2102;省略=全部"
    • Changedmoodle_forum3 fields changed
      • changedInput schema / properties / course / description
        Previous value: -"课程号,如 FIT2102"New value: +"课程号,如 FIT2102;省略=全部"
      • changedInput schema / properties / limit / description
        Previous value: -"最多返回条数"New value: +"数量参数;默认公告5、搜索10"
      • addedInput schema / properties / query / description
        Added value: +"搜索词;省略=最近公告"
    • Changedmoodle_grades2 fields changed
      • addedInput schema / properties / course / description
        Added value: +"课程号;省略=成绩总览"
      • changedInput schema / properties / graded_only / description
        Previous value: -"仅已有成绩"New value: +"true=仅已有成绩的项目"
    • Changedmoodle_messages2 fields changed
      • addedInput schema / properties / conversation_id / description
        Added value: +"对话 ID;省略=列对话"
      • changedInput schema / properties / limit / description
        Previous value: -"最多返回消息数"New value: +"数量上限;默认对话20、消息30"
    • Changedread_file4 fields changed
      • addedInput schema / properties / inner / description
        Added value: +"ZIP 内路径;省略=列 ZIP 清单"
      • addedInput schema / properties / max_chars / description
        Added value: +"最大字符数,默认20000,最高100000"
      • addedInput schema / properties / offset / description
        Added value: +"字符起点,默认0"
      • addedInput schema / properties / path / description
        Added value: +"list_files/search_content 返回的路径"
    • Changedsearch_content3 fields changed
      • changedInput schema / properties / course / description
        Previous value: -"课程号,如 FIT2102"New value: +"课程号,如 FIT2102;省略=全部"
      • changedInput schema / properties / limit / description
        Previous value: -"最多返回命中数"New value: +"命中上限,默认15,最高50"
      • addedInput schema / properties / query / description
        Added value: +"全文搜索关键词或短语"
    • Changedstudy_todo1 field changed
      • addedInput schema / properties / days / description
        Added value: +"未来天数,默认7"
  3. 10 tool updatesv0.1.1
    • Changeded_lessons4 fields changed
      • addedInput schema / properties / course / description
        Added value: +"课程号,如 FIT2102"
      • addedInput schema / properties / max_chars / description
        Added value: +"最大返回字符数"
      • addedInput schema / properties / offset / description
        Added value: +"字符偏移"
      • addedInput schema / properties / status / description
        Added value: +"完成状态"
    • Changeded_thread2 fields changed
      • addedInput schema / properties / max_chars / description
        Added value: +"最大返回字符数"
      • addedInput schema / properties / offset / description
        Added value: +"字符偏移"
    • Changeded_threads4 fields changed
      • addedInput schema / properties / category / description
        Added value: +"Ed 分类"
      • addedInput schema / properties / course / description
        Added value: +"课程号,如 FIT2102"
      • addedInput schema / properties / limit / description
        Added value: +"最多返回条数"
      • addedInput schema / properties / offset / description
        Added value: +"结果偏移"
    • Changeded_updates2 fields changed
      • addedInput schema / properties / course / description
        Added value: +"课程号,如 FIT2102"
      • addedInput schema / properties / limit / description
        Added value: +"最多返回条数"
    • Changedmoodle_assignments2 fields changed
      • addedInput schema / properties / course / description
        Added value: +"课程号,如 FIT2102"
      • addedInput schema / properties / missing_only / description
        Added value: +"仅可能漏交"
    • Changedmoodle_due1 field changed
      • addedInput schema / properties / days / description
        Added value: +"未来天数,默认14"
    • Changedmoodle_forum2 fields changed
      • addedInput schema / properties / course / description
        Added value: +"课程号,如 FIT2102"
      • addedInput schema / properties / limit / description
        Added value: +"最多返回条数"
    • Changedmoodle_grades1 field changed
      • addedInput schema / properties / graded_only / description
        Added value: +"仅已有成绩"
    • Changedmoodle_messages1 field changed
      • addedInput schema / properties / limit / description
        Added value: +"最多返回消息数"
    • Changedsearch_content2 fields changed
      • addedInput schema / properties / course / description
        Added value: +"课程号,如 FIT2102"
      • addedInput schema / properties / limit / description
        Added value: +"最多返回命中数"
  4. 17 tool updatesv0.1.0
    • First observedcourses
    • First observeded_lessons
    • First observeded_thread
    • First observeded_threads
    • First observeded_updates
    • First observedlist_files
    • First observedmonash_login
    • First observedmonash_status
    • First observedmonash_sync
    • First observedmoodle_assignments
    • First observedmoodle_due
    • First observedmoodle_forum
    • First observedmoodle_grades
    • First observedmoodle_messages
    • First observedread_file
    • First observedsearch_content
    • First observedstudy_todo

TDQS

A4.4/5.0

Scored across 17 tools

Disambiguation5/5

Each tool targets a distinct platform+resource+action, and the descriptions explicitly cross-reference neighbors (e.g. forum→search_moodle_forum, Ed→search_ed_threads, files→list_files/read_file), leaving almost no room for misselection.

Naming Consistency5/5

Consistent verb_noun/verb_platform_noun pattern throughout (get_*, search_*, list_*, read_*, start_*, sync_*), with no mixing of camelCase or vague verbs.

Tool Count4/5

17 tools is slightly heavy but justified given the breadth of Moodle, Ed, local files, and diagnostics/sync surfaces; nearly every tool owns a distinct resource, though a couple of read tools could theoretically be consolidated.

Completeness4/5

Strong read-side coverage of courses, files, forums, lessons, grades, assignments, due dates, todos, and diagnostics. Gaps exist in write operations (sending messages, replying to threads, submitting assignments), but the kit appears intentionally read-only so these are largely out of scope.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers