Monash Study Kit
A local, read-only Monash study assistant that connects Claude to your Moodle and Ed accounts so you can ask about deadlines, grades, course materials, and discussions — with everything staying on your own computer.
To-dos & deadlines:
study_todogives a combined weekly view (due work, possibly missed assignments, unfinished Ed lessons, announcements, unread replies);moodle_dueandmoodle_assignmentslist upcoming deadlines and submission/missing status per course.Grades & feedback:
moodle_gradesshows per-unit grade breakdowns, scores and feedback, or an overall overview.Course & unit info:
courseslists your tracked Moodle/Ed units;moodle_forumreads announcements or searches forum posts;moodle_messageslists and reads Moodle private conversations.Course material search:
search_contentdoes full-text search over slides, PDFs, notes and transcripts with page/section locations;list_fileslists local files and links;read_filereads a file's text (including ZIP listings and paginated reads).Ed discussions:
ed_updatesshows new posts/replies since a time (optionally peeking without advancing the cursor);ed_threadsbrowses/searches posts by type, status or unanswered;ed_threadreads a full thread with replies.Ed Lessons:
ed_lessonslists lesson progress, reads a single lesson's content, or returns quiz questions for revision.Account & maintenance:
monash_statuschecks login/sync/error state (or a full health check);monash_loginopens the local Moodle login window with your consent;monash_syncrefreshes Moodle/Ed data and the index on demand.
Provides read-only access to Monash Moodle, including deadlines, grades, assignments, announcements, course files, activities, messages, and calendar feeds.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Monash Study KitDo I have anything due this week, and any new Ed replies?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Monash Study Kit
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.
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).
No AI needed: out of usage or just want a quick look?
monash todoanswers in a second (see Works without Claude usage).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 | shAfter it finishes, close Terminal and open it again, then:
uv tool install https://github.com/Waldo0926/monash-study-kit/archive/refs/heads/main.zipmonash setupWindows
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.zipmonash setup
uvis 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:
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.
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.
Units: tracks this semester's units by default, or pick your own.
Connect to Claude: adds
monashto 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 helpin 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 loginWhile 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 |
|
Deadlines |
|
Which file / page covers a topic |
|
New Ed posts and replies |
|
Replies to my own posts |
|
Read a full post |
|
Grades / possibly missed assignments |
|
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/monashWindows: run
(Get-Command monash).Sourcein PowerShell, usuallyC:\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 |
| Untested |
Cursor |
| Untested |
VS Code (Copilot) | Command Palette → | Untested |
Gemini CLI |
| 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 todoand 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 falseLecture-recording transcripts (only with the
[media]extra installed)
Privacy and security
Where data lives:
macOS:
~/Library/Application Support/monash-study-kitWindows:
%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). Runmonash opento 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
secretsfolder 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-kitmonash uninstallremoves 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 |
| Login status, last sync time |
| Everything it can do, each with an example question and the matching command |
| Health check when something breaks: checks each item and tells you how to fix it; send the whole output to whoever helps you |
| This week: deadlines, possibly missed work, unfinished Ed lessons, announcements, unread replies |
| Deadlines |
| Full-text search over course files, course-notes sites, Ed lesson pages and recording transcripts (with page numbers / timestamps) |
| Sync now |
| Log in to Moodle / replace the Ed token |
| Re-pick tracked units |
| Open the course-files folder |
| Grades and feedback |
| Possibly missed assignments |
| Announcements / find an activity / download one file / messages / calendar subscription link |
| Ed updates / new replies to my posts / search / read a post |
| Ed lesson progress / quiz questions (for revision) |
| A whole lesson as Markdown: text slides, reading pages and PDFs in order, plus its quiz questions |
| View / change settings (restart Claude Desktop afterwards) |
| 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 mediaVideos 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 updateRestart 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 --helpReleasing: 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" --> CoreModule | What it does |
| Moodle client (cookie session, AJAX calls, downloads that never send the cookie off-site) and a small HTML tree for page parsing |
| Mirrors each unit's Moodle files into |
| Deadlines (with an iCal fallback when the session has expired), grades, assignments, announcements, the combined to-do list |
| Ed API client, incremental sync of posts and replies, local queries |
| Ed Lessons: progress, slides, quiz questions, a whole lesson as Markdown |
| Full-text search over PDFs, Office files, course-notes websites and transcripts |
| Dedicated login window driven over the Chrome DevTools Protocol (a minimal WebSocket client in the standard library) |
| Sync and keep-alive jobs, the MCP server, the command line |
| Health check, help and preset prompts, new-version notice, adding the server to Claude |
| Optional: lecture recordings to timestamped transcripts ( |
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 toolsget_ed_lessonsARead-only
读取 Ed Lessons:列进度、读单节或测验。Ed 讨论用 search_ed_threads;跨课件全文搜索用 search_content。返回 Lesson 列表/进度、正文或测验内容。
| Name | Required | Description | Default |
|---|---|---|---|
| quiz | No | true=返回测验而非 Lesson 列表 | |
| course | Yes | 课程号,如 FIT2102 | |
| lesson | No | Lesson 名称或编号;有值=读正文 | |
| module | No | 可选模块名称或编号 | |
| offset | No | 正文字符起点,默认0 | |
| status | No | 完成状态筛选 | |
| max_chars | No | 最大字符数,默认30000,最高100000 |
TDQS
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.
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.
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.
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.
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.
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_statusARead-only
诊断登录、同步、索引和错误状态;报错或“用不了”时用。只需刷新数据用 sync_monash_data;登录过期且用户同意后用 start_monash_login。返回状态摘要或完整体检。
| Name | Required | Description | Default |
|---|---|---|---|
| full | No | true=完整诊断;false=简要状态 |
TDQS
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.
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.
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.
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.
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.
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_gradesARead-only
读取 Moodle 成绩;无 course 看总览,有 course 看评分项、得分和反馈。提交状态用 list_moodle_assignments,不用于截止日历。
| Name | Required | Description | Default |
|---|---|---|---|
| course | No | 课程号;省略=成绩总览 | |
| graded_only | No | true=仅已有成绩的项目 |
TDQS
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.
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.
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.
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.
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.
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_messagesARead-only
读取 Moodle 私信;无 conversation_id 列对话,有值则读该对话,且不会标已读。论坛内容用 search_moodle_forum。返回对话或消息。
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | 数量上限;默认对话20、消息30 | |
| conversation_id | No | 对话 ID;省略=列对话 |
TDQS
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.
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.
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.
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.
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.
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_todoARead-only
综合查看 Moodle/Ed 待办:截止、漏交、Lesson、公告和未读回复;问“这周要做/交什么”用。只查截止用 list_moodle_due;查提交状态用 list_moodle_assignments。返回分类待办。
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | 未来天数,默认7 |
TDQS
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.
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.
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.
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.
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.
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_coursesARead-only
列出 Moodle/Ed 课程;问有哪些课或其他工具需要先确定课程时用。Moodle 未登录时回退本地课程表。返回课程代码、名称和标识。
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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_updatesARead-only
列 Ed 新帖、新回复和本人相关未读回复;浏览/搜索历史帖子用 search_ed_threads,读完整帖子用 read_ed_thread。返回更新分组和同步时间。
| Name | Required | Description | Default |
|---|---|---|---|
| peek | No | true=查看但不推进更新游标 | |
| limit | No | 活动上限,默认30 | |
| since | No | 起始时间:7d/12h/2w 或 ISO 日期时间 | |
| course | No | 课程号,如 FIT2102;省略=全部 |
TDQS
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.
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.
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.
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.
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.
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_filesARead-only
列已同步本地课件或外链,不搜索正文;搜正文用 search_content,读取 path 用 read_file。返回文件/外链和可供 read_file 使用的路径。
| Name | Required | Description | Default |
|---|---|---|---|
| week | No | 教学周编号,如 8 | |
| links | No | true=列外链;须同时给 course | |
| query | No | 按文件名或路径筛选 | |
| course | No | 课程号,如 FIT2102;省略=全部 |
TDQS
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.
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.
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.
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.
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.
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_assignmentsARead-only
列 Moodle 作业及截止、提交和可用成绩状态;仅看日历截止用 list_moodle_due,仅看成绩/反馈用 get_moodle_grades。missing_only 可只看可能漏交。
| Name | Required | Description | Default |
|---|---|---|---|
| course | No | 课程号,如 FIT2102;省略=全部 | |
| missing_only | No | true=仅可能漏交的作业 |
TDQS
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.
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.
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.
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.
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.
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_dueARead-only
列 Moodle 未来截止和日历事件;需要提交状态/作业详情用 list_moodle_assignments,需要成绩用 get_moodle_grades。未登录可回退 iCal。返回截止事件和时间。
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | 未来天数,默认14 | |
| course | No | 课程号,如 FIT2102;省略=全部 |
TDQS
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.
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.
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.
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.
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.
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_threadARead-only
读取单个 Ed 帖子正文和回复;找帖子用 search_ed_threads,新动态用 list_ed_updates;live=true 先刷新。返回 Markdown,长内容支持分页。
| Name | Required | Description | Default |
|---|---|---|---|
| live | No | true=先从 Ed 实时刷新该帖 | |
| offset | No | Markdown 字符起点,默认0 | |
| thread | Yes | 帖子 ID、FIT2102#42 或 Ed 链接 | |
| max_chars | No | 最大字符数,默认30000,最高100000 |
TDQS
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.
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.
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.
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.
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.
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_fileARead-only
读取 list_files/search_content 给出的课件路径;ZIP 用 inner,长内容用 offset/max_chars 分页。若要搜索未知文件先用 search_content。返回文本或 ZIP 清单。
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | list_files/search_content 返回的路径 | |
| inner | No | ZIP 内路径;省略=列 ZIP 清单 | |
| offset | No | 字符起点,默认0 | |
| max_chars | No | 最大字符数,默认20000,最高100000 |
TDQS
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.
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.
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.
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.
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.
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_contentARead-only
全文搜索已同步课件/PDF/笔记/字幕;只列文件用 list_files,拿到 path 后用 read_file。返回匹配片段、文件路径和定位信息。
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | 命中上限,默认15,最高50 | |
| query | Yes | 全文搜索关键词或短语 | |
| course | No | 课程号,如 FIT2102;省略=全部 |
TDQS
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.
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.
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.
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.
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.
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_threadsARead-only
浏览或搜索 Ed 帖子;读完整正文/回复用 read_ed_thread,只看新动态用 list_ed_updates。返回帖子摘要;浏览模式支持 offset 分页。
| Name | Required | Description | Default |
|---|---|---|---|
| only | No | 状态筛选:收藏/关注/未看/本人/未读回复 | |
| type | No | 帖子类型 | |
| limit | No | 条数上限,默认15,最高50 | |
| query | No | 搜索标题/正文;省略=浏览帖子 | |
| since | No | 起始时间:7d/12h/2w 或 ISO 日期时间 | |
| course | No | 课程号,如 FIT2102;省略=全部 | |
| offset | No | 浏览结果偏移;搜索时忽略 | |
| category | No | Ed 分类 | |
| unanswered | No | true=仅未回答问题 |
TDQS
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.
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.
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.
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.
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.
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_forumARead-only
查看/搜索 Moodle 公告和论坛:无 query 看公告,有 query 搜索。Ed 讨论请用 search_ed_threads。返回公告或匹配帖子摘要、正文片段和链接。
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | 数量参数;默认公告5、搜索10 | |
| query | No | 搜索词;省略=最近公告 | |
| course | No | 课程号,如 FIT2102;省略=全部 |
TDQS
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.
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.
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.
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.
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.
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。
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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;已在同步时不会重复启动。
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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.
28 tool updates
v0.1.4- Removed
courses - Removed
ed_lessons - Removed
ed_thread - Removed
ed_threads - Removed
ed_updates - Added
get_ed_lessons - Added
get_monash_status - Added
get_moodle_grades - Added
get_moodle_messages - Added
get_study_todo - Added
list_courses - Added
list_ed_updates - Added
list_moodle_assignments - Added
list_moodle_due - Removed
monash_login - Removed
monash_status - Removed
monash_sync - Removed
moodle_assignments - Removed
moodle_due - Removed
moodle_forum - Removed
moodle_grades - Removed
moodle_messages - Added
read_ed_thread - Added
search_ed_threads - Added
search_moodle_forum - Added
start_monash_login - Removed
study_todo - Added
sync_monash_data
14 tool updates
v0.1.3- Changed
ed_lessons6 fields changed- added
Input schema / properties / lesson / descriptionAdded value: +"Lesson 名称或编号;有值=读正文" - changed
Input schema / properties / max_chars / descriptionPrevious value: -"最大返回字符数"New value: +"最大字符数,默认30000,最高100000" - added
Input schema / properties / module / descriptionAdded value: +"可选模块名称或编号" - changed
Input schema / properties / offset / descriptionPrevious value: -"字符偏移"New value: +"正文字符起点,默认0" - added
Input schema / properties / quiz / descriptionAdded value: +"true=返回测验而非 Lesson 列表" - changed
Input schema / properties / status / descriptionPrevious value: -"完成状态"New value: +"完成状态筛选"
- Changed
ed_thread4 fields changed- added
Input schema / properties / live / descriptionAdded value: +"true=先从 Ed 实时刷新该帖" - changed
Input schema / properties / max_chars / descriptionPrevious value: -"最大返回字符数"New value: +"最大字符数,默认30000,最高100000" - changed
Input schema / properties / offset / descriptionPrevious value: -"字符偏移"New value: +"Markdown 字符起点,默认0" - added
Input schema / properties / thread / descriptionAdded value: +"帖子 ID、FIT2102#42 或 Ed 链接"
- Changed
ed_threads8 fields changed- changed
Input schema / properties / course / descriptionPrevious value: -"课程号,如 FIT2102"New value: +"课程号,如 FIT2102;省略=全部" - changed
Input schema / properties / limit / descriptionPrevious value: -"最多返回条数"New value: +"条数上限,默认15,最高50" - changed
Input schema / properties / offset / descriptionPrevious value: -"结果偏移"New value: +"浏览结果偏移;搜索时忽略" - added
Input schema / properties / only / descriptionAdded value: +"状态筛选:收藏/关注/未看/本人/未读回复" - added
Input schema / properties / query / descriptionAdded value: +"搜索标题/正文;省略=浏览帖子" - added
Input schema / properties / since / descriptionAdded value: +"起始时间:7d/12h/2w 或 ISO 日期时间" - added
Input schema / properties / type / descriptionAdded value: +"帖子类型" - added
Input schema / properties / unanswered / descriptionAdded value: +"true=仅未回答问题"
- Changed
ed_updates4 fields changed- changed
Input schema / properties / course / descriptionPrevious value: -"课程号,如 FIT2102"New value: +"课程号,如 FIT2102;省略=全部" - changed
Input schema / properties / limit / descriptionPrevious value: -"最多返回条数"New value: +"活动上限,默认30" - added
Input schema / properties / peek / descriptionAdded value: +"true=查看但不推进更新游标" - added
Input schema / properties / since / descriptionAdded value: +"起始时间:7d/12h/2w 或 ISO 日期时间"
- Changed
list_files4 fields changed- added
Input schema / properties / course / descriptionAdded value: +"课程号,如 FIT2102;省略=全部" - added
Input schema / properties / links / descriptionAdded value: +"true=列外链;须同时给 course" - added
Input schema / properties / query / descriptionAdded value: +"按文件名或路径筛选" - added
Input schema / properties / week / descriptionAdded value: +"教学周编号,如 8"
- Changed
monash_status1 field changed- added
Input schema / properties / full / descriptionAdded value: +"true=完整诊断;false=简要状态"
- Changed
moodle_assignments2 fields changed- changed
Input schema / properties / course / descriptionPrevious value: -"课程号,如 FIT2102"New value: +"课程号,如 FIT2102;省略=全部" - changed
Input schema / properties / missing_only / descriptionPrevious value: -"仅可能漏交"New value: +"true=仅可能漏交的作业"
- Changed
moodle_due1 field changed- added
Input schema / properties / course / descriptionAdded value: +"课程号,如 FIT2102;省略=全部"
- Changed
moodle_forum3 fields changed- changed
Input schema / properties / course / descriptionPrevious value: -"课程号,如 FIT2102"New value: +"课程号,如 FIT2102;省略=全部" - changed
Input schema / properties / limit / descriptionPrevious value: -"最多返回条数"New value: +"数量参数;默认公告5、搜索10" - added
Input schema / properties / query / descriptionAdded value: +"搜索词;省略=最近公告"
- Changed
moodle_grades2 fields changed- added
Input schema / properties / course / descriptionAdded value: +"课程号;省略=成绩总览" - changed
Input schema / properties / graded_only / descriptionPrevious value: -"仅已有成绩"New value: +"true=仅已有成绩的项目"
- Changed
moodle_messages2 fields changed- added
Input schema / properties / conversation_id / descriptionAdded value: +"对话 ID;省略=列对话" - changed
Input schema / properties / limit / descriptionPrevious value: -"最多返回消息数"New value: +"数量上限;默认对话20、消息30"
- Changed
read_file4 fields changed- added
Input schema / properties / inner / descriptionAdded value: +"ZIP 内路径;省略=列 ZIP 清单" - added
Input schema / properties / max_chars / descriptionAdded value: +"最大字符数,默认20000,最高100000" - added
Input schema / properties / offset / descriptionAdded value: +"字符起点,默认0" - added
Input schema / properties / path / descriptionAdded value: +"list_files/search_content 返回的路径"
- Changed
search_content3 fields changed- changed
Input schema / properties / course / descriptionPrevious value: -"课程号,如 FIT2102"New value: +"课程号,如 FIT2102;省略=全部" - changed
Input schema / properties / limit / descriptionPrevious value: -"最多返回命中数"New value: +"命中上限,默认15,最高50" - added
Input schema / properties / query / descriptionAdded value: +"全文搜索关键词或短语"
- Changed
study_todo1 field changed- added
Input schema / properties / days / descriptionAdded value: +"未来天数,默认7"
10 tool updates
v0.1.1- Changed
ed_lessons4 fields changed- added
Input schema / properties / course / descriptionAdded value: +"课程号,如 FIT2102" - added
Input schema / properties / max_chars / descriptionAdded value: +"最大返回字符数" - added
Input schema / properties / offset / descriptionAdded value: +"字符偏移" - added
Input schema / properties / status / descriptionAdded value: +"完成状态"
- Changed
ed_thread2 fields changed- added
Input schema / properties / max_chars / descriptionAdded value: +"最大返回字符数" - added
Input schema / properties / offset / descriptionAdded value: +"字符偏移"
- Changed
ed_threads4 fields changed- added
Input schema / properties / category / descriptionAdded value: +"Ed 分类" - added
Input schema / properties / course / descriptionAdded value: +"课程号,如 FIT2102" - added
Input schema / properties / limit / descriptionAdded value: +"最多返回条数" - added
Input schema / properties / offset / descriptionAdded value: +"结果偏移"
- Changed
ed_updates2 fields changed- added
Input schema / properties / course / descriptionAdded value: +"课程号,如 FIT2102" - added
Input schema / properties / limit / descriptionAdded value: +"最多返回条数"
- Changed
moodle_assignments2 fields changed- added
Input schema / properties / course / descriptionAdded value: +"课程号,如 FIT2102" - added
Input schema / properties / missing_only / descriptionAdded value: +"仅可能漏交"
- Changed
moodle_due1 field changed- added
Input schema / properties / days / descriptionAdded value: +"未来天数,默认14"
- Changed
moodle_forum2 fields changed- added
Input schema / properties / course / descriptionAdded value: +"课程号,如 FIT2102" - added
Input schema / properties / limit / descriptionAdded value: +"最多返回条数"
- Changed
moodle_grades1 field changed- added
Input schema / properties / graded_only / descriptionAdded value: +"仅已有成绩"
- Changed
moodle_messages1 field changed- added
Input schema / properties / limit / descriptionAdded value: +"最多返回消息数"
- Changed
search_content2 fields changed- added
Input schema / properties / course / descriptionAdded value: +"课程号,如 FIT2102" - added
Input schema / properties / limit / descriptionAdded value: +"最多返回命中数"
17 tool updates
v0.1.0- First observed
courses - First observed
ed_lessons - First observed
ed_thread - First observed
ed_threads - First observed
ed_updates - First observed
list_files - First observed
monash_login - First observed
monash_status - First observed
monash_sync - First observed
moodle_assignments - First observed
moodle_due - First observed
moodle_forum - First observed
moodle_grades - First observed
moodle_messages - First observed
read_file - First observed
search_content - First observed
study_todo
TDQS
Scored across 17 tools
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.
Consistent verb_noun/verb_platform_noun pattern throughout (get_*, search_*, list_*, read_*, start_*, sync_*), with no mixing of camelCase or vague verbs.
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.
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
Related MCP Connectors
Search university course materials, your flashcards, quizzes, streak and quota. All tools read-only.
Connect your Moodle to AI assistants: courses, content, grading and reports from the chat.
Read-only MCP tools for AI agent discovery, structured resources, and NIULAI information.
Search, read, create and edit your Memol notes from Claude. Team note-taking with AI search.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceConnects Claude to Canvas LMS accounts, enabling natural language queries about courses, assignments, grades, and files. Supports content search, file downloads, syllabus retrieval, and bulk course exports via 13 integrated tools.6 npmMIT
- AlicenseNot gradedqualityCmaintenanceProvides Claude with full access to Moodle learning management systems, enabling interaction with courses, files, assignments, grades, and calendar events. It also supports building Obsidian study vaults from course materials through automated knowledge graph creation.20 npm18MIT
- AlicenseBqualityCmaintenanceEnables Claude to interact with Canvas LMS, allowing natural language queries about courses, deadlines, grades, and feedback.29MIT
- AlicenseNot gradedqualityBmaintenanceEnables Claude to interact with Moodle via the official REST API for read-only tasks like listing courses, materials, assignments, submissions, and grades. Uses token-based authentication and emphasizes safe, no-write operations.2MIT